众所周知,大陆的身份证号码是由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;
}