0
点赞
收藏
分享

微信扫一扫

最全面的身份证号码校验方法

在觉 2021-09-25 阅读 63
前端

关于国家公民身份号码规定如下:

/**
 * 〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定:
 *    公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
 *
 * 地址码编码规则为:
 *    第一位数字表示地区,1 是华北,2 是东北,3 是华东,4 是中南,5 是西南,6 是西北。
 *    第二位数字表示户籍地所在的直辖市、省、自治区,比如在华北地区,1 代表北京市,2 代表天津市等。
 *    第三、四位数字则表示户籍所在地的区、县、县级市、旗。
 *    第五、六位数字是户籍所在地。
 *
 * 出生日期码:
 *    身份证号码第七位到第十四位表示编码对象出生的年、月、日。
 *
 * 顺序码:
 *    身份证号码第十五位到十七位是顺序码,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。
 *
 * 校验码:
 *    身份证号码最后一位为校验码。
 *
 * 校验码的计算方法:
 *    一、将身份证号码前面的 17 位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
 *    二、将这 17 位数字和系数相乘的结果相加。
 *    三、用加出来的和除以 11,余数只可能有:0-1-2-3-4-5-6-7-8-9-10 这 11 个数字。其分别对应的最后一位身份证的号码为:1-0-X -9-8-7-6-5-4-3-2。
 *    四、如果余数是 2,那么身份证的第 18 位数字就是 X。
 */

身份证校验的 JavaScript 实现如下:

/**
 * 支持 15 位和 18 位身份证号校验
 *
 * @param {string} code 身份证号码
 * @returns {boolean} 是否检验通过
 */
const checkIDNumber = code => {
  if (!code || typeof code !== 'string') return false
  // prettier-ignore
  const cites = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43', '44', '45', '46', '50', '51', '52', '53', '54', '61', '62', '63', '64', '65', '71', '81', '82', '91']
  const re = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)?$/i
  const len = code.length

  // 格式错误
  if (!(re.test(code) && (len === 15 || len === 18))) {
    return false
  }

  // 地址码错误
  const cityCode = code.substr(0, 2)
  if (!cites.includes(cityCode)) {
    return false
  }

  // 18 位需校验最后一位校验码
  if (len === 18) {
    const codeArr = code.split('')
    const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    const parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
    let sum = 0
    let ai = 0
    let wi = 0
    for (let i = 0; i < 17; i++) {
      ai = codeArr[i]
      wi = factor[i]
      sum += ai * wi
    }
    if (parity[sum % 11] != codeArr[17].toUpperCase()) {
      // 校验码错误
      return false
    }
  }

  return true
}

此方法已收录至:toFrankie/Some-JavaScript-File,还有其他一些比较实用的方法,比如中文转拼音等,请看这里

The end.

举报

相关推荐

0 条评论