IOS 使用UITextField自动格式化银行卡号

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

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

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


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

    

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

   NSString *text = [textField text];

    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"];
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
        return NO;
    }

    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSString *newString = @"";
    while (text.length > 0) {
        NSString *subString = [text substringToIndex:MIN(text.length, 4)];
        newString = [newString stringByAppendingString:subString];
        if (subString.length == 4) {
            newString = [newString stringByAppendingString:@" "];
        }
        text = [text substringFromIndex:MIN(text.length, 4)];
    }

    newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];

    if (newString.length >= 20) {
        return NO;
    }

    [textField setText:newString];

    return NO;
}


    我写的:

// 16位以内 (3个空格)
        NSString *str_bangNum = [NSString stringWithFormat:@"%@%@",textField.text,string];
        if (textField.text.length < 23) {
            //银行卡只能输入数字
            cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
            NSString *filterStr = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
            BOOL basicTest = [string isEqualToString:filterStr];
            if(!basicTest)
            {
                return NO;
            }
            
            //显示内容的格式化
            if(range.length > 0 && str_bangNum.length > 0)// 支持删除
            {
                NSString *tmp_str = [str_bangNum bankNumToNormalNum];
                str_bangNum = [tmp_str substringToIndex:(tmp_str.length - 1)];
            }
            str_bangNum = [str_bangNum normalNumToBankNum];
            textField.text = str_bangNum;
            return NO;
        }
        else
        {
            if(range.length > 0 && str_bangNum.length > 0)// 支持删除
            {
                NSString *tmp_str = [str_bangNum bankNumToNormalNum];
                str_bangNum = [tmp_str substringToIndex:(tmp_str.length - 1)];
                str_bangNum = [str_bangNum normalNumToBankNum];
                textField.text = str_bangNum;
            }
            return NO;
        }

 

// 正常号转银行卡号 - 增加4位间的空格
-(NSString *)normalNumToBankNum
{
     NSString *tmpStr = [self bankNumToNormalNum];
    
    int size = (tmpStr.length / 4);
   
    NSMutableArray *tmpStrArr = [[NSMutableArray alloc] init];
    for (int n = 0;n < size; n++)
    {
        [tmpStrArr addObject:[tmpStr substringWithRange:NSMakeRange(n*4, 4)]];
    }
    
    [tmpStrArr addObject:[tmpStr substringWithRange:NSMakeRange(size*4, (tmpStr.length % 4))]];
    
    tmpStr = [tmpStrArr componentsJoinedByString:@" "];

    return tmpStr;
}

// 银行卡号转正常号 - 去除4位间的空格
-(NSString *)bankNumToNormalNum
{
    return [self stringByReplacingOccurrencesOfString:@" " withString:@""];
}


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

NSNumber *number = [NSNumber numberWithLongLong:1234567890098765];
NSNumberFormatter *formatter = [NSNumberFormatter new];
[formatter setUsesGroupingSeparator:YES];
[formatter setGroupingSize:4];
[formatter setGroupingSeparator:@" "];
NSString *string = [formatter stringFromNumber:number];
    不过这样有个缺点就是第一位数字之前还有个空格,需要Split it.
    

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值