javascript身份证号码验证

https://github.com/oxcow/id-number-validator

版权声明:

15位身份证号码编码规则

  1. ddddddyymmddxxp
  1. dddddd: 地区码
  2. yymmdd: 出生年月日
  3. xx: 顺序类编码,无法确定
  4. p: 性别。奇数位男,偶数为女

18位身份证号码编码规则

  1. ddddddyyyymmddxxxy
  1. dddddd: 地区码
  2. yyyymmdd: 出生年月日
  3. xxx:顺序类编码,无法确定。奇数为男,偶数为女
  4. y: 校验位。可通过前17位计算获取

校验规则

  1. 加权因子Wi

    从右到左依次定义为:

    Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]

  2. 校验位值

    Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]

    其中 10 身份证中用 X 替代。

  3. 校验位位置

    Y_P = mod(Σ(Ai+Wi),11)

    其中下标 i 为身份证号码 从右往左 的 2…8 位; Ai为身份证号对应位数值。

    该公式表示将身份证的前17位与其对应的加权因子 Wi 相乘并求和,再将得到的结果与 11 求模,所得的结果即为校验位值所在的位置。然后直接在校验位值 Y 中查找即可得到校验位值.

比如有一为 330304197002051590 的身份证号,那么最后一位校验位 0 的验证过程如下:

  1. 加权求和

    3×7 + 3×9 + 0×10 + 3×5 + 0×8 + 4×4 + 1×2 + 9×1 + 7×6 + 0×3 + 0×7 + 2×9 + 0×10 + 5×5 + 1×8 + 5×4 + 9×2 = 221

  2. 求模

    221 % 11 = 1

  3. 获取验证位数值

    Y[1] = 0

javascript编码实现

针对上述身份证生成规则的描述,在验证时针对15位身份证号只需要判断其出生日期是否正确即可;而针对18位身份证号,除了验证出生日期外还需要对最后的校验位进行验证。

因此我们命名一个名为getIdCardInfo的函数,接受身份证号作为参数进行验证。该函数返回身份证信息对象。该对象具有5个属性,分别为:

  1. isTrue : 身份证号是否有效。默认为 false
  2. year : 出生年。默认为null
  3. month : 出生月。默认为null
  4. day : 出生日。默认为null
  5. isMale : 是否为男性。默认false
  6. isFemale : 是否为女性。默认false

源代码

您可进入该项目的GitHub页进行下载或贡献

  1. function getIdCardInfo(cardNo) {
  2. var info = {
  3. isTrue : false,
  4. year : null,
  5. month : null,
  6. day : null,
  7. isMale : false,
  8. isFemale : false
  9. };
  10. if (!cardNo || (15 != cardNo.length && 18 != cardNo.length) ) {
  11. info.isTrue = false;
  12. return info;
  13. }
  14. if (15 == cardNo.length) {
  15. var year = cardNo.substring(6, 8);
  16. var month = cardNo.substring(8, 10);
  17. var day = cardNo.substring(10, 12);
  18. var p = cardNo.substring(14, 15); //性别位
  19. var birthday = new Date(year, parseFloat(month) - 1,
  20. parseFloat(day));
  21. // 对于老身份证中的年龄则不需考虑千年虫问题而使用getYear()方法
  22. if (birthday.getYear() != parseFloat(year)
  23. || birthday.getMonth() != parseFloat(month) - 1
  24. || birthday.getDate() != parseFloat(day)) {
  25. info.isTrue = false;
  26. } else {
  27. info.isTrue = true;
  28. info.year = birthday.getFullYear();
  29. info.month = birthday.getMonth() + 1;
  30. info.day = birthday.getDate();
  31. if (p % 2 == 0) {
  32. info.isFemale = true;
  33. info.isMale = false;
  34. } else {
  35. info.isFemale = false;
  36. info.isMale = true
  37. }
  38. }
  39. return info;
  40. }
  41. if (18 == cardNo.length) {
  42. var year = cardNo.substring(6, 10);
  43. var month = cardNo.substring(10, 12);
  44. var day = cardNo.substring(12, 14);
  45. var p = cardNo.substring(14, 17)
  46. var birthday = new Date(year, parseFloat(month) - 1,
  47. parseFloat(day));
  48. // 这里用getFullYear()获取年份,避免千年虫问题
  49. if (birthday.getFullYear() != parseFloat(year)
  50. || birthday.getMonth() != parseFloat(month) - 1
  51. || birthday.getDate() != parseFloat(day)) {
  52. info.isTrue = false;
  53. return info;
  54. }
  55. var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子
  56. var Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值.10代表X
  57. // 验证校验位
  58. var sum = 0; // 声明加权求和变量
  59. var _cardNo = cardNo.split("");
  60. if (_cardNo[17].toLowerCase() == ‘x‘) {
  61. _cardNo[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
  62. }
  63. for ( var i = 0; i < 17; i++) {
  64. sum += Wi[i] * _cardNo[i];// 加权求和
  65. }
  66. var i = sum % 11;// 得到验证码所位置
  67. if (_cardNo[17] != Y[i]) {
  68. return info.isTrue = false;
  69. }
  70. info.isTrue = true;
  71. info.year = birthday.getFullYear();
  72. info.month = birthday.getMonth() + 1;
  73. info.day = birthday.getDate();
  74. if (p % 2 == 0) {
  75. info.isFemale = true;
  76. info.isMale = false;
  77. } else {
  78. info.isFemale = false;
  79. info.isMale = true
  80. }
  81. return info;
  82. }
  83. return info;
  84. }

验证示例

验证

相关阅读:

http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/

时间: 2024-10-20 19:43:26

javascript身份证号码验证的相关文章

身份证号码验证正则表达式及用法(包括:位数、规则等)

//sfz.js页面function CheckIDCard(StrNumber) { //判断身份证号码格式函数 //公民身份号码是特征组合码, //排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 //身份证号码长度判断 if(StrNumber.length<15||StrNumber.length==16||StrNumber.length==17||StrNumber.length>18) { return {"code"

身份证号码验证

<head> <title>身份证号码验证</title> <meta charset="utf-8"/> <script type="text/javascript"> var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", 21:"辽宁&quo

C#实现身份证号码验证的方法

本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很简单. 主要注意的是,目前的身份证分为16和18位,然后分别验证校验位,省份,生日即可. 主要类如下: /// <summary> /// 验证身份证号码类 /// </summary> public class IDCardValidation { /// <summary&g

编程乐趣:身份证号码验证的方法

随着如今互联网的发展,越来越多的注冊用户的地方都用到了身份证.那么对于输入的身份证怎样验证呢?看以下的代码,事实上非常easy.主要注意的是,眼下的身份证分为16和18位,然后分别验证校验位.省份,生日就可以.主要类: /// <summary> /// 验证身份证号码类 /// </summary> public class IDCardValidation { /// <summary> /// 验证身份证合理性 /// </summary> /// &

js正则实现二代身份证号码验证详解

js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码. 出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符. 顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员

身份证号码验证及其相关!

2015-11-16 16:35:32 小写转大写:toUpper(); 大写转小写:toLower(); 替换:Replace('X','Y'); 将字符串转换为字符数组:toCharArray(); 从X处取出Y个字符:string.Substring(ing x,int y); 在X处插入Y:string.Insert(int X,string Y); 用x分割:string.Split('x'); 验证18位身份证号(包含小写x): 1 /// <summary> 2 /// 18位身

15/18位身份证号码验证的正则表达式总结(详细版)

前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地区: [1-9]\d{5} 年的前两位: (18|19|([23]\d))            1800-2399 年的后两位: \d{2} 月份: ((0[1-9])|(10|11|12)) 天

js实现身份证号码验证

/*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码.出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符.顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员编定的顺序号.顺序码的奇数分给男性,偶

lua身份证号码验证~

--验证身份证信息 --只支持18位身份证的验证 --[[ #身份证18位编码规则:dddddd yyyymmdd xxx y #dddddd:地区码 #yyyymmdd: 出生年月日 #xxx:顺序类编码,无法确定,奇数为男,偶数为女 #y: 校验码,该位数值可通过前17位计算获得 #<p /> #18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ] #验证位 Y = [ 1, 0, 1