zoukankan      html  css  js  c++  java
  • IOS 使用UITextField自动格式化银行卡号

    项目中需要输入银行卡,希望自动按照4为分组格式化。

        自己用UITextField的Delegate实现了一个,但是突然发现IOS提供了NSNumberFormatter好像可以对数字进行格式化,可是不知道这个玩意咋用,就在stackOverflow上发了求助帖。

        不一会就有一印度阿三答复我了,丫的不仅答复我了,还修改了我提问中的语法错误,让人汗颜啊……惊恐

        他的写法原理跟我的差不多,比我的略微稳妥点,本来想对比一下的,但是家里没有开发环境弄不到代码,我先上印度佬的代码。

    1. -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {  
    2.   
    3.    NSString *text = [textField text];  
    4.   
    5.     NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];  
    6.     string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];  
    7.     if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {  
    8.         return NO;  
    9.     }  
    10.   
    11.     text = [text stringByReplacingCharactersInRange:range withString:string];  
    12.     text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];  
    13.   
    14.     NSString *newString = @"";  
    15.     while (text.length > 0) {  
    16.         NSString *subString = [text substringToIndex:MIN(text.length, 4)];  
    17.         newString = [newString stringByAppendingString:subString];  
    18.         if (subString.length == 4) {  
    19.             newString = [newString stringByAppendingString:@" "];  
    20.         }  
    21.         text = [text substringFromIndex:MIN(text.length, 4)];  
    22.     }  
    23.   
    24.     newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];  
    25.   
    26.     if (newString.length >= 20) {  
    27.         return NO;  
    28.     }  
    29.   
    30.     [textField setText:newString];  
    31.   
    32.     return NO;  
    33. }  
     

        我写的:

    1. // 16位以内 (3个空格)  
    2.         NSString *str_bangNum = [NSString stringWithFormat:@"%@%@",textField.text,string];  
    3.         if (textField.text.length < 23) {  
    4.             //银行卡只能输入数字  
    5.             cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];  
    6.             NSString *filterStr = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];  
    7.             BOOL basicTest = [string isEqualToString:filterStr];  
    8.             if(!basicTest)  
    9.             {  
    10.                 return NO;  
    11.             }  
    12.               
    13.             //显示内容的格式化  
    14.             if(range.length > 0 && str_bangNum.length > 0)// 支持删除  
    15.             {  
    16.                 NSString *tmp_str = [str_bangNum bankNumToNormalNum];  
    17.                 str_bangNum = [tmp_str substringToIndex:(tmp_str.length - 1)];  
    18.             }  
    19.             str_bangNum = [str_bangNum normalNumToBankNum];  
    20.             textField.text = str_bangNum;  
    21.             return NO;  
    22.         }  
    23.         else  
    24.         {  
    25.             if(range.length > 0 && str_bangNum.length > 0)// 支持删除  
    26.             {  
    27.                 NSString *tmp_str = [str_bangNum bankNumToNormalNum];  
    28.                 str_bangNum = [tmp_str substringToIndex:(tmp_str.length - 1)];  
    29.                 str_bangNum = [str_bangNum normalNumToBankNum];  
    30.                 textField.text = str_bangNum;  
    31.             }  
    32.             return NO;  
    33.         }  
    1. // 正常号转银行卡号 - 增加4位间的空格  
    2. -(NSString *)normalNumToBankNum  
    3. {  
    4.      NSString *tmpStr = [self bankNumToNormalNum];  
    5.       
    6.     int size = (tmpStr.length / 4);  
    7.      
    8.     NSMutableArray *tmpStrArr = [[NSMutableArray alloc] init];  
    9.     for (int n = 0;n < size; n++)  
    10.     {  
    11.         [tmpStrArr addObject:[tmpStr substringWithRange:NSMakeRange(n*4, 4)]];  
    12.     }  
    13.       
    14.     [tmpStrArr addObject:[tmpStr substringWithRange:NSMakeRange(size*4, (tmpStr.length % 4))]];  
    15.       
    16.     tmpStr = [tmpStrArr componentsJoinedByString:@" "];  
    17.   
    18.     return tmpStr;  
    19. }  
    20.   
    21. // 银行卡号转正常号 - 去除4位间的空格  
    22. -(NSString *)bankNumToNormalNum  
    23. {  
    24.     return [self stringByReplacingOccurrencesOfString:@" " withString:@""];  
    25. }  

       当然这个有点偏离我提问的主题,我是希望使用NSNumberFormatter实现,然后另外一位大牛给出了答案:

    1. NSNumber *number = [NSNumber numberWithLongLong:1234567890098765];  
    2. NSNumberFormatter *formatter = [NSNumberFormatter new];  
    3. [formatter setUsesGroupingSeparator:YES];  
    4. [formatter setGroupingSize:4];  
    5. [formatter setGroupingSeparator:@" "];  
    6. NSString *string = [formatter stringFromNumber:number];  

        不过这样有个缺点就是第一位数字之前还有个空格,需要Split it.
        

  • 相关阅读:
    CentOS 6.9/7通过yum安装指定版本的Nginx
    Ubuntu 16.04安装uafred用于替代Alfred
    Alfred修改内置Terminal为iTerm
    CentOS 6.9下的iptables在本机用DNAT转发指定IP到内网IP无效的问题解决(127.0.0.1)
    Java在Service层异常封装
    Chrome无法播放m3u8格式的直播视频流的问题解决
    Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决
    macOS High Sierra 10.13正式版USB安装盘制作
    Maven打包排除某个资源或者目录
    mybatis实现变量定义,实现sql业务代码
  • 原文地址:https://www.cnblogs.com/BinZone/p/4680352.html
Copyright © 2011-2022 走看看