验证身份证真实性

前提:需要第三方正则表达式的类。

// 验证身份证格式
- (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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值