前端技术汇总贴

下载

立即收藏!这应该是你见过的最全前端下载总结

校验

身份证号

根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  • 地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
  • 出生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
  • 顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。
  • 校验码是根据前面十七位数字码,按照 ISO 7064:1983.MOD 11-2 校验码计算出来的检验码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
const City = {
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:"国外"
};

// 15位校验规则:6位地址编码+6位出生日期+3位顺序号
// 18位校验规则:6位地址编码+8位出生日期+3位顺序号+1位校验位
const IdentityCodeRegExp = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;

// 校验位规则 公式:∑(ai×Wi)(mod 11)
// i----表示号码字符从由至左包括校验码在内的位置序号;
// ai----表示第i位置上的号码字符值;
// Wi----示第i位置上的加权因子,其数值依据公式Wi=2^(n-1)(mod 11)计算得出。
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 ];// 校验位

const IdentityCodeValid = (code) => {
if( !code || !IdentityCodeRegExp.test(code) ){
return "身份证号格式错误";
}

if( !City[code.substr(0,2)] ){
return "身份证号中地址编码错误";
}

// 18位身份证需要验证最后一位校验位
if( code.length == 18 ){
let sum = 0;
code.substr(0,17).split('').forEach((ai, i) => {
let wi = factor[i];
sum += ai * wi;
});

let last = parity[sum % 11];

if( last != code[17] ){
return "校验位错误";
}
}
}

参考 完美身份证正则表达式