根据上图百度百科中的身份证号码的编码规则做出以下判断
①由于前六位中的地址码比较多,这里就不做判断了.这里只是粗糙的判断一下出生日期,为什么说是粗糙的判断呢,因为正则表达式的局限性.
//身份证号
- (BOOL)validateIdentityCard:(NSString *)IDCardNumber
{
if (IDCardNumber.length == 15) {
//| 地址 | 年 | 月 | 日 |
NSString *regex = @"^(\\d{6})([3-9][0-9][01][0-9][0-3])(\\d{4})$";
NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
return [identityCardPredicate evaluateWithObject:IDCardNumber];
} else if (IDCardNumber.length == 18) {
//| 地址 | 年 | 月 | 日 |
NSString *regex = @"^(\\d{6})([1][9][3-9][0-9][01][0-9][0-3])(\\d{4})(\\d|[xX])$";
NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
return [identityCardPredicate evaluateWithObject:IDCardNumber];
} else {
return NO;
}
}
②然后再判断最后一位的校验码,这第二步只适用于18位的身份证号码,因为15位的没有校验码(15位的比18位的少年份的前两个数和最后一位校验码,因此如果用户填写了15位的身份证号码,其实我们也可以直接帮他转成18位的)
/**
* 验证身份证号码是否正确的方法
*
* @param IDNumber 传进身份证号码字符串
*
* @return 返回YES或NO表示该身份证号码是否符合标准
*/
- (BOOL)isCorrect:(NSString *)IDNumber
{
NSMutableArray *IDArray = [NSMutableArray array];
for (int i = 0; i < 18; 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];
NSArray *remainderArray = [NSArray arrayWithObjects:@"1", @"0", @"X", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"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;
}
NSString *str = remainderArray[(sum % 11)];
NSString *string = [IDNumber substringFromIndex:17];
if ([str isEqualToString:string]) {
return YES;
} else {
return NO;
}
}