iOS开发自动补全第18位身份证号码的X

众所周知,大陆的身份证号码是由18位数字组成的,当然也有一个特例就是有些人的身份证号码末位是X。对于iOS开发来说真是蛋疼的要命,用普通键盘样式,字母键盘要和数字键盘切换,明显不利于用户操作,但是用数字键盘吧,又没有X。大多数人肯定就会想直接自定义键盘。这个方法是能解决问题,但是总这么千篇一律的,感觉不到一点新意。我查阅了身份证号码的百度百科后,发现最后一位其实可以通过前17位数字计算出来的。于是我就想出了一个不自定义键盘也能用数字键盘写出身份证号码的方法:当写到17位的时候,如果判断出来该用户的18位为X,则自动补全X,否则依然由用户输入第18位

// textField代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // string.length为0,表明没有输入字符,应该是正在删除,应该返回YES。
    if (string.length == 0) {
        return YES;
    }
    // length为当前输入框中的字符长度
    NSUInteger length = textField.text.length + string.length;
    // 如果该页面中还有其他的输入框,则需要做这个判断
    if (textField == self.idNumberTextField) {
    	// str为当前输入框中的字符
        NSString *str = [NSString stringWithFormat:@"%@%@", textField.text, string];
        // 当输入到17位数的时候,通过theLastIsX方法判断最后一位是不是X
        if (length == 17 && [self theLastIsX:str]) {
        	// 如果是17位,并通过前17位计算出18位为X,自动补全,并返回NO,禁止编辑。
            textField.text = [NSString stringWithFormat:@"%@%@X", textField.text, string];
            return NO;
        }
        // 如果是其他情况则直接返回小于等于18(最多输入18位)
        return length <= 18;
    }
    return YES;
}
// 判断最后一个是不是X
- (BOOL)theLastIsX:(NSString *)IDNumber {
    NSMutableArray *IDArray = [NSMutableArray array];
    for (int i = 0; i < 17; i++) {
        NSRange range = NSMakeRange(i, 1);
        NSString *subString = [IDNumber substringWithRange:range];
        [IDArray addObject:subString];
    }
    NSArray *coefficientArray = [NSArray arrayWithObjects:@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2", nil];
    int sum = 0;
    for (int i = 0; i < 17; i++) {
        int coefficient = [coefficientArray[i] intValue];
        int ID = [IDArray[i] intValue];
        sum += coefficient * ID;
    }
    if (sum % 11 == 2) return YES;
    else return NO;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值