前提:需要第三方正则表达式的类。
// 验证身份证格式
- (BOOL)verifyIDcard:(NSString *)IDCardStr
{
NSMutableArray *arrIDcard = [[NSMutableArray alloc]init];
// 身份证第一位到第十七位的系数
NSArray *arrCoefficient = [NSArray arrayWithObjects:@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",@"6",@"3",@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",nil];
// 先用正则表达式判断是否为字母和数字组成,并且判断是不是18位
if ([IDCardStr isMatchedByRegex:@"^[A-Za-z0-9]+$"] && [IDCardStr length] == 18)
{
NSRange range;
range.length = 1;
range.location = 0;
// 将text中的身份证号码放入数组中
for (int i = 0; i < 18; i++)
{
range.location = i;
[arrIDcard addObject:[IDCardStr substringWithRange:range]];
}
// 把身份证号码前17位数字和系数相乘的结果相加。
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum+=[[arrIDcard objectAtIndex:i] intValue]*[[arrCoefficient objectAtIndex:i] intValue];
}
int mod = sum % 11; // 用加出来和除以11得出余数
// 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2
if ([[arrIDcard objectAtIndex:17] isEqualToString:@"X"] || [[arrIDcard objectAtIndex:17] isEqualToString:@"x"])
{
if (2 == mod)
{
NSLog(@"正确格式2");
return YES;
}
return NO;
}
else if ((12 - mod) == [[arrIDcard objectAtIndex:17] intValue])
{
NSLog(@"正确格式3");
return YES;
}
else
{
NSLog(@"错误格式4");
return NO;
}
}
else
{
NSLog(@"错误格式1");
return NO;
}
}