js验证身份证号码记录的方法


Posted in Javascript onApril 26, 2019

在一些需要填写身份证的表单网页中,需要对身份证的输入做一个验证,于是,我记录下了自己写的验证。在写验证之前,我们需要理解身份证的一些常识规则。中华人民共和国居民身份证验证规则如下:

1.号码的结构:

  • 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
  • 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,
  • 三位数字顺序码和一位数字校验码。

2.地址码

*  表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

3.出生日期码

*  表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

4.顺序码

*  表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

5.校验码

*  根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

而计算方法则为:

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、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。

例如:某男性的身份证号码为53010219200508011x, 我们看看这个身份证是不是合法的身份证。

首先我们得出前17位的乘积和[(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)]是189,

然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。

最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。

根据以上的规则和计算方法,我们就可以封装一个验证身份证的函数,如下:

const validateIdCard = function (idcard) {
    // 判断如果传入的不是一个字符串,则转换成字符串
    idcard = typeof idcard === 'string' ? idcard : String(idcard);
    //正则表达式验证号码的结构
    let regx = /^[\d]{17}[0-9|X|x]{1}$/;
    if (regx.test(idcard)) {
      // 验证前面17位数字,首先定义前面17位系数
      let sevenTeenIndex = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
      // 截取参数前17位
      let front_seventeen = idcard.slice(0, 17);
      // 截取第18位
      let eighteen = idcard.slice(17, 18);
      // 这里如果是X要转换成小写,如果是数字在这里是字符串类型,则转换成数字类型,好做判断
      eighteen = isNaN(parseInt(eighteen)) ? eighteen.toLowerCase() : parseInt(eighteen);
      // 定义一个变量计算系数乘积之和余数
      let remainder = 0;
      //利用循环计算前17位数与系数乘积并添加到一个数组中
      // charAt()类似数组的访问下标一样,访问单个字符串的元素,返回的是一个字符串因此要转换成数字
      for (let i = 0; i < 17; i++) {
        remainder = (remainder += parseInt(front_seventeen.charAt(i)) * sevenTeenIndex[i]) % 11;
      }
      //余数对应数字数组
      let remainderKeyArr = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
      // 取得余数对应的值
      let remainderKey = remainderKeyArr[remainder] === 'X' ? remainderKeyArr[remainder].toLowerCase() : remainderKeyArr[remainder];
      console.log(remainderKey);
      console.log(eighteen)
      // 如果最后一位数字对应上了余数所对应的值,则验证合格,否则不合格,
      // 由于不确定最后一个数字是否是大小写的X,所以还是都转换成小写进行判断
      if (eighteen === remainderKey) {
        return idcard;
      } else {
        console.log('你输入的身份证号码格式不对!')
      }
    } else {
      console.log('你输入的身份证号码格式不对,请重新输入!')
    }
  }
  //函数调用
  validateIdCard('53010219200508011x');//验证合格

总结

以上所述是小编给大家介绍的js验证身份证号码记录的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
Jul 05 Javascript
js+html5实现侧滑页面效果
Jul 15 Javascript
JavaScript实现表单注册、表单验证、运算符功能
Oct 15 Javascript
详解JQuery基础动画操作
Apr 12 jQuery
微信小程序按钮点击跳转页面详解
May 06 Javascript
vue移动端城市三级联动组件使用详解
Jul 26 Javascript
JavaScript函数IIFE使用详解
Oct 21 Javascript
JS实现基本的网页计算器功能示例
Jan 16 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 Javascript
JS 基本概念详细介绍
Oct 16 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 #Javascript
react高阶组件添加和删除props
Apr 26 #Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 #Javascript
vue 进阶之实现父子组件间的传值
Apr 26 #Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 #Javascript
配置一个vue3.0项目的完整步骤
Apr 26 #Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 #Javascript
You might like
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python异常学习笔记
2015/02/03 Python
Python的设计模式编程入门指南
2015/04/02 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python爬取微信公众号文章
2018/08/31 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
十八届三中全会学习方案
2014/02/16 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
毕业论文致谢信
2015/05/14 职场文书
学生会主席任命书
2015/09/21 职场文书
导游词幽默开场白
2019/06/26 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android