zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    链式队列(先进先出)
    单链表的基本操作
    线性表的基本操作
    面向对象分析与设计
    结构化分析与设计
    图片
    2021-ACM-ICPC-济南站 K Search For Mafuyu 【树的遍历与回溯,dfs, 邻接表】
    Codeforces Round #754 (Div. 2), problem: (A) A.M. Deviation泪目 万万没想到狂wa是因为这
    Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习
    Educational Codeforces Round 116 (Rated for Div. 2), problem: (C) Banknotes
  • 原文地址:https://www.cnblogs.com/softidea/p/7530823.html
Copyright © 2011-2022 走看看