18位身份证号码校验( JS && Object

作者: 尹_路人 | 来源:发表于2016-08-29 18:22 被阅读433次

    计算方法 (<u>百度百科</u>)

    1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

    2. 将这17位数字和系数相乘的结果相加。

    3. 用加出来和除以11,看余数是多少?

    4. 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即馀数0对应1,馀数1对应0,馀数2对应X...)

    5. 通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。

      例如:某男性的身份证号码为【53010219200508011x】, 我们看看这个身份证是不是合法的身份证。
      首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189,然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。


    • JS

        function testIdCard (id){
            var reg = /^[1-6][0-7][\d]{4}((19[\d]{2})|(20[0-1][\d]))((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\d)|(3[0-1]))[\d]{3}[\dx]$/;
            var isFormatMatch = reg.test(id);
            if (!isFormatMatch) {
                console.log("base format does not match ID Card");
                return false;
            };
            var ids = id.split("");
            var modulus = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
            var matchLast = [1,0,"X",9,8,7,6,5,4,3,2]
            var sum = 0;
            for (var i = 0; i < modulus.length; i++) {
                sum += (modulus[i] * ids[i]);
            };
      
            var checksum = matchLast[sum % 11];
            if (checksum != ids[ids.length-1].toUpperCase()) {
                console.log("error: checknum does not match");
                return false;
            }
            return true;
        }
      
        var MATCH = testIdCard('110325198006173638');
        
        console.log(MATCH ? "MATCH" : "DOES NOT MATCH");
      
    • Object-C

        -(BOOL)isIDCard:(NSString *)ID {
            NSString * reg = @"(^[1-6][0-7][\\d]{4}((19[\\d]{2})|(20[0-1][\\d]))((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\\d)|(3[0-1]))[\\d]{3}[\\dx]$)";
            NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", reg];
            if (![predicate evaluateWithObject:ID]) {
                return NO;
            }
            NSMutableArray *ids = [NSMutableArray arrayWithCapacity:18];
            for (int i = 0; i < ID.length; i++) {
                NSString *str = [ID substringWithRange:NSMakeRange(i, 1)];
                [ids addObject:str];
            }
            NSArray *modulus = @[@7,@9,@10,@5,@8,@4,@2,@1,@6,@3,@7,@9,@10,@5,@8,@4,@2];
            NSArray *matchLst = @[@1,@0,@10,@9,@8,@7,@6,@5,@4,@3,@2];
            NSInteger sum = 0;
            for (int i = 0; i < modulus.count; i++) {
                sum += ([modulus[i] integerValue] * [ids[i] integerValue]);
            };
            NSInteger check = [matchLst[sum%11] integerValue];
            if ([[ids.lastObject uppercaseString] isEqualToString:@"X"]) {
                if (check != 10) {
                    return NO;
                }
            }else{
                if ([ids.lastObject integerValue] != check) {
                    return NO;
                }
            }
            return YES;
        }

    相关文章

      网友评论

      • 0baa9561da80:APP登陆界面输入手机号码号码登陆,怎么验证输入的是正确的手机号码,有ES6写法的demo吗?我刚毕业工作,刚接触RN
        尹_路人:@一抹斜阳傷 手机号码校验搜正则表达式啊

      本文标题:18位身份证号码校验( JS && Object

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