生成测试号码
地 址 码 :
出 生 年 :
月:
日:
性 别 :男
女
生成个数:
结构简介
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; };