美文网首页
身份证号码正则

身份证号码正则

作者: 水中的蓝天 | 来源:发表于2020-06-15 15:40 被阅读0次

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

    身份证号码规则:

    • 前1、2位数字表示:所在省份的代码;

    • 第3、4位数字表示:所在城市的代码;

    • 第5、6位数字表示:所在区县的代码;

    • 第7-14位数字表示:出生年、月、日;

    • 第15、16位数字表示:所在地的派出所的代码;

    • 第17位数字表示性别:奇数表示男性,偶数表示女性;

    • 第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0-9的数字,有时也用x表示。
      法律依据:
      《GB11643-1999公民身份号码》规定,公民身份号码的编码对象、号码的结构和表示形式,使每个编码对象获得一个唯一的、不变的法定号码。

    • 校验码计算

    公式.png

    计算公式令结果为 Y,Y的计算公式为:Y = mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。

    校验码.png

    例如:假设某女性居民的
    15位身份证号码是320105820927512,32表示江苏省,01表示南京市,05表示鼓楼区,820927表示1982年9月27日。512表示是该地区,其中2表示是女性。那么,升级为18位后的号码为32010519820927512C。下面就根据公式来计算C的值。
    Y = mod(S, 11)=MOD(313,11)=5
    根据校验值对应表,可知C=7,该人员身份证号码为:
    320105198209275127

    补齐后.png

    又如:某男性公民身份证号码的本体码为: 34052419800101001
    计算公式令结果为 Y,Y的计算公式为:Y = mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。

    校验.png
    
    /**
     校验身份证号码是否正确 返回BOOL值
    
     @param idCardString 身份证号码
     @return 返回BOOL值 YES or NO
     */
    - (BOOL)xyh_verifyIDCardString:(NSString *)idCardString {
    
        NSString *regex = @"^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
    
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
        BOOL isRe = [predicate evaluateWithObject:idCardString];
    
        if (!isRe) {
             //身份证号码格式不对
            NSLog(@"身份证号码格式不正确");
            return NO;
        }
    
        //加权因子 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
        NSArray *weightingArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
        //校验码 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2
        NSArray *verificationArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
        
        NSInteger sum = 0;//保存前17位各自乖以加权因子后的总和
        for (int i = 0; i < weightingArray.count; i++) {//将前17位数字和加权因子相乘的结果相加
            NSString *subStr = [idCardString substringWithRange:NSMakeRange(i, 1)];
            sum += [subStr integerValue] * [weightingArray[i] integerValue];
        }
        
        NSInteger modNum = sum % 11;//总和除以11取余
        NSString *idCardMod = verificationArray[modNum]; //根据余数取出校验码
        NSString *idCardLast = [idCardString.uppercaseString substringFromIndex:17]; //获取身份证最后一位
        
        if (modNum == 2) {//等于2时 idCardMod为10  身份证最后一位用X表示10
            idCardMod = @"X";
        }
        if ([idCardLast isEqualToString:idCardMod]) { //身份证号码验证成功
            return YES;
        } else { //身份证号码验证失败
            return NO;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:身份证号码正则

          本文链接:https://www.haomeiwen.com/subject/wbxhxktx.html