验证身份证真实性

来源:互联网 发布:王者荣耀充值源码 编辑:程序博客网 时间:2024/05/22 16:42
前提:需要第三方正则表达式的类。
// 验证身份证格式- (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;    }}

0 0
原创粉丝点击