1、身份证号规则:
第二代居民身份证是由18位数字组成,其包含6位数字地址码,8位数字出生日期码,3位数顺序码和1位数校验码,其顺序如下:
1-6位:6位地址码。
7-14位:8位出生日期码。
15-17位:3位顺序码。
18位:1位校验码。
其中,第17位还用于表示性别,奇数表示男性,偶数表示女性。
第18位校验码的计算为:用前17位数本体码分别乘以其对应的加权因子并求和,结果除以11得到余数,根据余数查询对照表得到校验码。
计算校验码举例:
假如一个身份证前17位为:11223344556677890( 虽不合理,仅为举例 )
1、本体码乘以其加权因子并求和:
1*7+1*9+2*10+2*5+...+9*4+0*2=440
2、和除以11取余数,得到校验码:
440%11=0
3、查询校验码可得0对应的是1,故校验码为1。
因此,该完整身份证号码为:112233445566778901
转换成代码:(目前这套规则还有问题,对于出生日期的校验还有待完善)
const equalsIgnoreCase = (a, b) => {
if (a === b) {
return true
}
if (typeof (b) === 'string') {
return a.toLowerCase() == b.toLowerCase()
}
return false
}
const checkIdCard = () => {
// process.argv 用于从node命令行获取数据,使用可忽略
const inputId = process.argv[2]
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
const checkCodes = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
let sum = 0
for (let i = 0; i < 17; i++) {
sum += parseInt(inputId.substring(i, i + 1) * weights[i])
}
let checkCode = sum % 11
let correctChecode = checkCodes[checkCode]
console.log(equalsIgnoreCase(inputId.substring(17), correctChecode))
return equalsIgnoreCase(inputId.substring(17), correctChecode)
}
// 82000019550514409X
checkIdCard()