身份证校验规则

身份证号验证算法

1、简单校验

+(BOOL)checkUserIDCard:(NSString *)userID

{

    //长度不为18的都排除掉

    if (userID.length!=18) {

        return NO;

    }

    

    //校验格式

    NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";

    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];

    BOOL flag = [identityCardPredicate evaluateWithObject:userID];

    

    if (!flag) {

        return flag;  //格式错误

    }else {

        //格式正确在判断是否合法

        //将前17位加权因子保存在数组里

        NSArray * idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];

        

        //这是除以11后,可能产生的11位余数、验证码,也保存成数组

        NSArray * idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];

        

        //用来保存前17位各自乖以加权因子后的总和

        NSInteger idCardWiSum = 0;

        for(int i = 0;i < 17;i++){

            NSInteger subStrIndex = [[userID substringWithRange:NSMakeRange(i, 1)] integerValue];

            NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];

            idCardWiSum+= subStrIndex * idCardWiIndex;

        }

        

        //计算出校验码所在数组的位置

        NSInteger idCardMod=idCardWiSum%11;

        

        //得到最后一位身份证号码

        NSString * idCardLast= [userID substringWithRange:NSMakeRange(17, 1)];

        

        //如果等于2,则说明校验码是10,身份证号码最后一位应该是X

        if(idCardMod==2){

            if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]){

                return YES;

            }else{

                return NO;

            }

        }else{

            //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码

            if([idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]){

                return YES;

            }else{

                return NO;

            }

        }

    }

}

2、详细校验

+ (BOOL)validateIDCardNumber:(NSString *)value {

    

    value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    int length =0;

    if (!value) {

        return NO;

    }else {

        length = value.length;

        if (length !=15 && length !=18) {

            return NO;

        }

    }

    

    // 省份代码

/* 北京市 11


天津市 12
河北省 13
山西省 14
内蒙古自治区 15
辽宁省 21
吉林省 22
黑龙江省 23
上海市 31
江苏省 32
浙江省 33
安徽省 34
福建省 35
江西省 36
山东省 37
河南省 41
湖北省 42
湖南省 43
广东省 44
广西壮族自治区 45
海南省 46
重庆市 50
四川省 51
贵州省 52
云南省 53
西藏自治区 54
陕西省 61
甘肃省 62
青海省 63
宁夏回族自治区 64
新疆维吾尔自治区 65
台湾省 71
香港特别行政区 81
澳门特别行政区 91*/

    NSArray *areasArray =@[@"11",@"12", @"13",@"14", @"15",@"21", @"22",@"23", @"31",@"32", @"33",@"34", @"35",@"36", @"37",@"41",@"42",@"43", @"44",@"45", @"46",@"50", @"51",@"52", @"53",@"54", @"61",@"62", @"63",@"64", @"65",@"71", @"81",@"82", @"91"];

    NSString *valueStart2 = [value substringToIndex:2];

    BOOL areaFlag =NO;

    for (NSString *areaCode in areasArray) {

        if ([areaCode isEqualToString:valueStart2]) {

            areaFlag =YES;

            break;

        }

    }

    

    if (!areaFlag) {

        

        return false;

        

    }

    NSRegularExpression *regularExpression;

    

    NSUInteger numberofMatch;

    int year =0;

    

    switch (length) {

            

        case 15:

            

            year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;

            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"

                                     

                                                                       options:NSRegularExpressionCaseInsensitive

                                     

                                                                         error:nil];//测试出生日期的合法性

            }else {

                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"

                                     

                                                                       options:NSRegularExpressionCaseInsensitive

                                     

                                                                         error:nil];//测试出生日期的合法性

                

            }

            

            numberofMatch = [regularExpression numberOfMatchesInString:value

                             

                                                              options:NSMatchingReportProgress

                             

                                                                range:NSMakeRange(0, value.length)];

//            [regularExpression release];

            if(numberofMatch >0) {

                

                return YES;

                

            }else {

                

                return NO;

                

            }

            

        case 18:

            year = [value substringWithRange:NSMakeRange(6,4)].intValue;

            

            if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"

                                                                       options:NSRegularExpressionCaseInsensitive

                                     

                                                                         error:nil];//测试出生日期的合法性

                

            }else {

                

                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"

                                     

                                                                       options:NSRegularExpressionCaseInsensitive

                                     

                                                                         error:nil];//测试出生日期的合法性

                

            }

            

            numberofMatch = [regularExpression numberOfMatchesInString:value

                             

                                                              options:NSMatchingReportProgress

                             

                                                                range:NSMakeRange(0, value.length)];

            if(numberofMatch >0) {

                

                int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;

                

                int Y = S %11;

                

                NSString *M =@"F";

                

                NSString *JYM =@"10X98765432";

                

                M = [JYM substringWithRange:NSMakeRange(Y,1)];// 判断校验位

                

                if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {

                    

                    return YES;// 检测ID的校验位

                    

                }else {

                    

                    return NO;

                    

                }

            }else {

                

                return NO;

                

            }

            

        default:

            

            return false;

            

    }

    

}

 

 

 

 

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值