关于国家公民身份号码规定如下:
/**
* 〖中华人民共和国国家标准 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.