身份证号校验

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值