JavaScript验证⾝份证号码(15位18位)
18位⾝份证号码各位的含义
1-2位省、⾃治区、直辖市代码
3-4位地级市、盟、⾃治州代码;
5-6位县、县级市、区代码;
7-14位出⽣年⽉⽇,⽐如19670401代表1967年4⽉1⽇;
15-17位为顺序号,其中17位男为单数,⼥为双数;
18位为校验码,0-9和X,由公式随机产⽣;
举例:
340523 1980 0101 0013这个⾝份证号的含义:
2020跨年朋友圈34为安徽省
05为马鞍⼭市
23为和县
19800101为出⽣⽇期(1980年1⽉1⽇)
001为顺序号(1为单数,代表为男性)
3为验证码
附链接:
⾝份证第18位(校验码)的计算⽅法
1. 将⾝份证号码前⾯的17位数分别乘以不同的系数;
从第⼀位到第⼗七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
2. 将这17位数字和系数相乘的结果相加;
3. ⽤加出来和除以11,看余数是多少;
4. 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;
其分别对应的最后⼀位⾝份证的号码为1-0-X-9-8-7-6-5-4-3-2
5. 通过上⾯得知如果余数是2,就会在⾝份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,⾝份证的最后⼀位号码就是2。
举例:
某男性的⾝份证号码是340523************。我们要看看这个⾝份证是不是合法的⾝份证。
⾸先我们得出前17位的乘积和:
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0*10+1*5+0*8+0*4+1*2) = 185
然后再求余:
185 % 11 = 9
最后通过对应规则就可以知道余数9对应的数字是3。所以,可以判定这是⼀个合格的⾝份证号码。
JavaScript校验18位⾝份证:
检验位数是否正确:
if (!/^\d{17}(\d|x)$/i.test(ID)) { callback(new Error('⾝份证格式错误')) };
// \d  匹配数字
// ^    匹配开始
// $    匹配结尾
// i    不区分⼤⼩写
// {17} 匹配17次
// \d|x 匹配数字或x
检验开头两位是否为正确的省市代码:
let city = {11: '北京', 12: '天津', 13: '河北', 14: '⼭西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '⿊龙江 ', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', if (city[ID.substr(0, 2)] === undefined) { callback(new Error('⾝份证地区码部分错误')) };
检验出⽣⽇期是否合法:
let birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
let d = new Date(birthday);
let newBirthday = d.getFullYear() + '/' + Month() + 1) + '/' + Date());
let currentTime = new Date().getTime();
let time = d.getTime();
if (time >= currentTime || birthday !== newBirthday) { callback(new Error('⾝份证出⾝⽇期部分错误')) };
判断校验码是否正确:
let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
1234567890let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
let i;
let residue;
for (i = 0; i < 17; i++) {
sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) { callback(new Error('⾝份证号码错误,最后⼀位校验码与前17位不匹配')) };2022假期
完整代码:
// 返回错误的错误根据个⼈需求修改
let checkID = (ID) => {
if (typeof ID !== 'string') { callback(new Error('⾮法字符串')) };
let city = {11: '北京', 12: '天津', 13: '河北', 14: '⼭西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '⿊龙江 ', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西'  let birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
let d = new Date(birthday);
let newBirthday = d.getFullYear() + '/' + Month() + 1) + '/' + Date());
let currentTime = new Date().getTime();
let time = d.getTime();
let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
let i;
let residue;
if (!/^\d{17}(\d|x)$/i.test(ID)) { callback(new Error('⾝份证格式错误')) };
if (city[ID.substr(0, 2)] === undefined) { callback(new Error('⾝份证地区码部分错误')) };
if (time >= currentTime || birthday !== newBirthday) { callback(new Error('⾝份证出⾝⽇期部分错误')) };
for (i = 0; i < 17; i++) {
sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) { callback(new Error('⾝份证号码错误,最后⼀位校验码与前17位不匹配')) };
callback();
}
15位⾝份证号码:
区别: 第⼆代⾝份证(18位)⽐第⼀代⾝份证(15位)增加了出⽣年份中的前两位数字和最后⼀位数字校验码。
1-2位省、⾃治区、直辖市代码;
3-4位地级市、盟、⾃治州代码;
5-6位县、县级市、区代码;
7-12位出⽣年⽉⽇,⽐如670401代表1967年4⽉1⽇;
13-15位为顺序号,其中15位男为单数,⼥为双数;
15位⾝份证号码转18位(加⼊年份前两位以及计算最后⼀位校验码):
let value18 = '';
let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];melonmusicawards
let cardTemp = 0;
let i;
value18 = value15.substr(0, 6) + '19' + value15.substr(6, value15.length - 6);
掌中之物何妍被轮了吗for (i = 0; i < 17; i++) {
近朱者赤近墨者黑是什么意思cardTemp += value18.substr(i, 1) * arrInt[i];
}
value18 += arrCh[cardTemp % 11];
// 再根据需求进⾏18位⾝份证号码的验证
// checkID(value18);
以上就是《JavaScript验证⾝份证号码(15位/18位)》的全部内容,如果有任何问题或者意见,欢迎各位在评论区留⾔。