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这个身份证号的含义:
34为安徽省
05为马鞍山市
23为和县
19800101为出生日期(1980年1月1日)
001为顺序号(1为单数,代表为男性)
3为验证码
附链接: 2018年8月中华人民共和国县以上行政区划代码
身份证第18位(校验码)的计算方法
将身份证号码前面的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位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
举例:
某男性的身份证号码是340523198001010013。我们要看看这个身份证是不是合法的身份证。
首先我们得出前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: '江西', 37: '山东', 41: '河南', 42: '湖北 ', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏 ', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外'};
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() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
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];
let 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位不匹配')) };
完整代码:
// 返回错误的错误根据个人需求修改
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: '江西', 37: '山东', 41: '河南', 42: '湖北 ', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏 ', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外'};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() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());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'];
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位)》的全部内容,如果有任何问题或者意见,欢迎各位在评论区留言。
JavaScript验证身份证号码(15位/18位)相关推荐
- absolute 必须 relative_Workfine如何控制身份证号码必须为18位?
在信息化系统的设计中,由于业务的需要,我们往往需要设置许多控制项,以保证系统能够按照业务要求流转,必须出库数量不能超过库存,人员信息不能重复录入,考勤区间不能有交叉等.此篇以实例的方式告诉大家如果通过 ...
- JS(JavaScript)验证身份证号码格式的合法性
一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...
- js验证身份证号码包括最后一位字母
通过正则进行js验证身份证号码: var numRegex = /^([a-zA-Z\d_]{1,18})$/;if (!numRegex.test(val)) {return '请输入身份证号码或格 ...
- java代码实现15位身份证号码升级到18位
转载网址 点击打开链接 转载一份作为记录,真心不错.受教! 18位身份证号码的组成: 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字 ...
- Excel如何把身份证号码升级到18位
1.首先选中身份证号码单元格区域 2.点击[DIY工具箱] 3.点击[身份证]选择[15位身份证升18位] 4.接着点击[确定] 5.最后选择合适的保存位置即可完成 6.完成效果如下图
- 15位与18位身份证号码有什么区别和联系
522529198802252219 身份证号码:共18位组成 1-3位为省级行政区代码 4-6位为市.县级行政区代码 7-10位为出生身年份 11-12位为出生身月份 13-14位为出生身 ...
- JS判断身份证(15位18位)的合法性
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- java代码验证身份证号码经典版
package com.haier.hmms.util; import java.text.SimpleDateFormat; import java.util.Date; /** * 验证身份证号 ...
- 详细验证身份证号码规则和姓名(汉字)的java代码
一.验证汉字的正则表达式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...
- 具体验证身份证号码规则和姓名(汉字)的java代码
一.验证汉字的正則表達式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...
最新文章
- 被吴恩达的Landing.ai刷屏后,我们从他的8条Twitter和9大招聘岗位中看到了三个有趣细节
- struts——struts在升级,作为程序员,该怎样以不变应万变?
- 我的HTTP/3学习笔记
- 华为epg-sms 多cp_Linux桌面上的SMS,Linux 25岁生日以及更多开源新闻
- Web后端学习笔记Flask(3)模板 实例
- Internet Tv Radio Player v5.2
- 计算机word图标不显示,win7系统中Word文档图标无法正常显示的解决方法
- 查看linux主机防火墙列表,linux防火墙状态查看的方法实例
- 大型网站技术架构-《大型网站技术架构:核心原理与案例分析》读书笔记
- linux端口健康检查,Smartmontools检查在Linux上的硬盘健康状况 | MOS86
- element UI 学习
- 批处理CMD显示彩色文字
- 50个直击灵魂的问题_直击心灵的48个问题
- 60903鱼植共生缸
- 001 变量与数据类型
- SPSS_Logistic回归分析结果表中的英文字母意思
- Eclipse---Refreshing /.org.eclipse.jdt.core.exter
- 基于迭代局部搜索的改进麻雀搜索算法
- atoi函数的模拟实现
- wdr6500 php,WDR6500成功刷上OpenWrt!!!附上教程。
热门文章
- Android Studio gradle 统一版本管理
- MOF-74(Zn), CAS:1033723-90-8
- Android aseats 加密,A SEAT
- java毕业设计老师评语_java毕业设计_springboot框架的教师评价评教系统
- 上传图片方法到免费服务器
- 面试字节跳动后台开发(实习)
- BZOJ 3717: [PA2014]Pakowanie
- 清除Svchost.exe
- 电脑默认重置html,windows10电脑默认自带浏览器被篡改如何恢复
- 电容或电感的电压_电感基础4——什么是LC电路的“谐振频率”?