生成测试号码

地 址 码 :  
出 生 年 :   月:   日:
性     别 :男  
生成个数:    
结构简介
1.号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2.地址码
表示编码对象常住户口所在县(县级市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3.出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4.顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5.校验码
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
身份证号码1到17位乘以对应的系数,然后除以11,用得到的余数值获取对应的数值然后与第18位相比是否一致
参考地址:链接
/* 校验身份证 */
function checkSFZCode(idCard) {
 // 15位和18位身份证号码的正则表达式
 var regIdCard = /^(^[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])$)$/;
 
 // 如果通过该验证,说明身份证格式正确,但准确性还需计算
 if (regIdCard.test(idCard)) {
   // 校验码的验证逻辑
   if (idCard.length == 18) {
     var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 将前17位加权因子保存在数组里
     var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后,可能产生的11位余数、验证码,也保存成数组
     var idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
     for (var i = 0; i < 17; i++) {
       idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];
     }
     
     var idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置
     var idCardLast = idCard.substring(17); // 得到最后一位身份证号码
     
     // 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
     if (idCardMod == 2) {
       if (idCardLast == 'X' || idCardLast == 'x') {
         return true;
       } else {
         return false;
       }
     } else {
       // 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
       if (idCardLast == idCardY[idCardMod]) {
         return true;
       } else {
         return false;
       }
     }
   }
 } else {
   return false;
 }
}
   
/* 校验身份证:ts版 */
export const checkSFZCode = (idCard: string): boolean => {
  // 15位和18位身份证号码的正则表达式
  const regIdCard =
    /^(^[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])$)$/;

  // 如果通过该验证,说明身份证格式正确,但准确性还需计算
  if (regIdCard.test(idCard)) {
    // 校验码的验证逻辑
    if (idCard.length == 18) {
      const idCardWi = new Array(
        7,
        9,
        10,
        5,
        8,
        4,
        2,
        1,
        6,
        3,
        7,
        9,
        10,
        5,
        8,
        4,
        2,
      ); // 将前17位加权因子保存在数组里
      const idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后,可能产生的11位余数、验证码,也保存成数组
      let idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
      for (let i = 0; i < 17; i += 1) {
        idCardWiSum += idCardWi[i] * +idCard.substring(i, i + 1);
      }

      const idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置
      const idCardLast = idCard.substring(17); // 得到最后一位身份证号码

      // 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
      if (idCardMod == 2) {
        if (idCardLast == 'X' || idCardLast == 'x') {
          return true;
        } else {
          return false;
        }
      } else {
        // 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
        if (`${idCardLast}` === `${idCardY[idCardMod]}`) {
          return true;
        } else {
          return false;
        }
      }
    }
  }
  return false;
};