1. 程式人生 > >javascript身份證號碼驗證

javascript身份證號碼驗證

返回 markdown user 問題 spa div mod 偶數 efi

https://github.com/oxcow/id-number-validator 版權聲明:
  • 關於《javascript身份證號碼驗證》的一切權利歸作者@Leeyee所有;
  • 非商用、非衍生;
  • 如需轉載需要註明來源於http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/
  • 15位身份證號碼編碼規則
  • 18位身份證號碼編碼規則
    • 校驗規則
  • javascript編碼實現
    • 源代碼
    • 驗證示例

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. }

驗證示例

相關閱讀:
  • javascript身份證號碼驗證
  • javascript中的null和undefined
  • jQuery插件編寫
  • jQuery eTable Plugin
  • jQuery MsgBox Plugin
  • 一些關於javascript、jQuery使用時的建議

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

javascript身份證號碼驗證