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位(校验码)的计算方法


  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。


举例:

某男性的身份证号码是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位)相关推荐

  1. absolute 必须 relative_Workfine如何控制身份证号码必须为18位?

    在信息化系统的设计中,由于业务的需要,我们往往需要设置许多控制项,以保证系统能够按照业务要求流转,必须出库数量不能超过库存,人员信息不能重复录入,考勤区间不能有交叉等.此篇以实例的方式告诉大家如果通过 ...

  2. JS(JavaScript)验证身份证号码格式的合法性

    一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...

  3. js验证身份证号码包括最后一位字母

    通过正则进行js验证身份证号码: var numRegex = /^([a-zA-Z\d_]{1,18})$/;if (!numRegex.test(val)) {return '请输入身份证号码或格 ...

  4. java代码实现15位身份证号码升级到18位

    转载网址   点击打开链接 转载一份作为记录,真心不错.受教! 18位身份证号码的组成: 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字 ...

  5. Excel如何把身份证号码升级到18位

    1.首先选中身份证号码单元格区域 2.点击[DIY工具箱] 3.点击[身份证]选择[15位身份证升18位] 4.接着点击[确定] 5.最后选择合适的保存位置即可完成 ​ 6.完成效果如下图

  6. 15位与18位身份证号码有什么区别和联系

    522529198802252219 身份证号码:共18位组成  1-3位为省级行政区代码  4-6位为市.县级行政区代码  7-10位为出生身年份  11-12位为出生身月份  13-14位为出生身 ...

  7. JS判断身份证(15位18位)的合法性

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  8. java代码验证身份证号码经典版

    package com.haier.hmms.util; import java.text.SimpleDateFormat; import java.util.Date; /**  * 验证身份证号 ...

  9. 详细验证身份证号码规则和姓名(汉字)的java代码

    一.验证汉字的正则表达式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...

  10. 具体验证身份证号码规则和姓名(汉字)的java代码

    一.验证汉字的正則表達式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param ...

最新文章

  1. 被吴恩达的Landing.ai刷屏后,我们从他的8条Twitter和9大招聘岗位中看到了三个有趣细节
  2. struts——struts在升级,作为程序员,该怎样以不变应万变?
  3. 我的HTTP/3学习笔记
  4. 华为epg-sms 多cp_Linux桌面上的SMS,Linux 25岁生日以及更多开源新闻
  5. Web后端学习笔记Flask(3)模板 实例
  6. Internet Tv Radio Player v5.2
  7. 计算机word图标不显示,win7系统中Word文档图标无法正常显示的解决方法
  8. 查看linux主机防火墙列表,linux防火墙状态查看的方法实例
  9. 大型网站技术架构-《大型网站技术架构:核心原理与案例分析》读书笔记
  10. linux端口健康检查,Smartmontools检查在Linux上的硬盘健康状况 | MOS86
  11. element UI 学习
  12. 批处理CMD显示彩色文字
  13. 50个直击灵魂的问题_直击心灵的48个问题
  14. 60903鱼植共生缸
  15. 001 变量与数据类型
  16. SPSS_Logistic回归分析结果表中的英文字母意思
  17. Eclipse---Refreshing /.org.eclipse.jdt.core.exter
  18. 基于迭代局部搜索的改进麻雀搜索算法
  19. atoi函数的模拟实现
  20. wdr6500 php,WDR6500成功刷上OpenWrt!!!附上教程。

热门文章

  1. Android Studio gradle 统一版本管理
  2. MOF-74(Zn), CAS:1033723-90-8
  3. Android aseats 加密,A SEAT
  4. java毕业设计老师评语_java毕业设计_springboot框架的教师评价评教系统
  5. 上传图片方法到免费服务器
  6. 面试字节跳动后台开发(实习)
  7. BZOJ 3717: [PA2014]Pakowanie
  8. 清除Svchost.exe
  9. 电脑默认重置html,windows10电脑默认自带浏览器被篡改如何恢复
  10. 电容或电感的电压_电感基础4——什么是LC电路的“谐振频率”?