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