idcard.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. //身份证号合法性校验
  2. var idCardNoUtil = {
  3. /*省,直辖市代码表*/
  4. provinceAndCitys: {
  5. 11: "北京",
  6. 12: "天津",
  7. 13: "河北",
  8. 14: "山西",
  9. 15: "内蒙古",
  10. 21: "辽宁",
  11. 22: "吉林",
  12. 23: "黑龙江",
  13. 31: "上海",
  14. 32: "江苏",
  15. 33: "浙江",
  16. 34: "安徽",
  17. 35: "福建",
  18. 36: "江西",
  19. 37: "山东",
  20. 41: "河南",
  21. 42: "湖北",
  22. 43: "湖南",
  23. 44: "广东",
  24. 45: "广西",
  25. 46: "海南",
  26. 50: "重庆",
  27. 51: "四川",
  28. 52: "贵州",
  29. 53: "云南",
  30. 54: "西藏",
  31. 61: "陕西",
  32. 62: "甘肃",
  33. 63: "青海",
  34. 64: "宁夏",
  35. 65: "新疆",
  36. 71: "台湾",
  37. 81: "香港",
  38. 82: "澳门",
  39. 91: "国外"
  40. },
  41. /*每位加权因子*/
  42. powers: ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"],
  43. /*第18位校检码*/
  44. parityBit: ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"],
  45. /*性别*/
  46. genders: {
  47. male: "男",
  48. female: "女"
  49. },
  50. /*校验地址码*/
  51. checkAddressCode: function(addressCode) {
  52. var check = /^[1-9]\d{5}$/.test(addressCode);
  53. if (!check) return false;
  54. if (idCardNoUtil.provinceAndCitys[parseInt(addressCode.substring(0, 2))]) {
  55. return true;
  56. } else {
  57. return false;
  58. }
  59. },
  60. /*校验日期码*/
  61. checkBirthDayCode: function(birDayCode) {
  62. var check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/.test(birDayCode);
  63. if (!check) return false;
  64. var yyyy = parseInt(birDayCode.substring(0, 4), 10);
  65. var mm = parseInt(birDayCode.substring(4, 6), 10);
  66. var dd = parseInt(birDayCode.substring(6), 10);
  67. var xdata = new Date(yyyy, mm - 1, dd);
  68. if (xdata > new Date()) {
  69. return false; //生日不能大于当前日期
  70. } else if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == dd)) {
  71. return true;
  72. } else {
  73. return false;
  74. }
  75. },
  76. /*计算校检码*/
  77. getParityBit: function(idCardNo) {
  78. var id17 = idCardNo.substring(0, 17);
  79. /*加权 */
  80. var power = 0;
  81. for (var i = 0; i < 17; i++) {
  82. power += parseInt(id17.charAt(i), 10) * parseInt(idCardNoUtil.powers[i]);
  83. }
  84. /*取模*/
  85. var mod = power % 11;
  86. return idCardNoUtil.parityBit[mod];
  87. },
  88. /*验证校检码*/
  89. checkParityBit: function(idCardNo) {
  90. var parityBit = idCardNo.charAt(17).toUpperCase();
  91. if (idCardNoUtil.getParityBit(idCardNo) == parityBit) {
  92. return true;
  93. } else {
  94. return false;
  95. }
  96. },
  97. /*校验15位或18位的身份证号码*/
  98. checkIdCardNo: function(idCardNo) {
  99. //15位和18位身份证号码的基本校验
  100. var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
  101. if (!check) return false;
  102. //判断长度为15位或18位
  103. if (idCardNo.length == 15) {
  104. return idCardNoUtil.check15IdCardNo(idCardNo);
  105. } else if (idCardNo.length == 18) {
  106. return idCardNoUtil.check18IdCardNo(idCardNo);
  107. } else {
  108. return false;
  109. }
  110. },
  111. //校验15位的身份证号码
  112. check15IdCardNo: function(idCardNo) {
  113. //15位身份证号码的基本校验
  114. var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo);
  115. if (!check) return false;
  116. //校验地址码
  117. var addressCode = idCardNo.substring(0, 6);
  118. check = idCardNoUtil.checkAddressCode(addressCode);
  119. if (!check) return false;
  120. var birDayCode = '19' + idCardNo.substring(6, 12);
  121. //校验日期码
  122. return idCardNoUtil.checkBirthDayCode(birDayCode);
  123. },
  124. //校验18位的身份证号码
  125. check18IdCardNo: function(idCardNo) {
  126. //18位身份证号码的基本格式校验
  127. var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/
  128. .test(idCardNo);
  129. if (!check) return false;
  130. //校验地址码
  131. var addressCode = idCardNo.substring(0, 6);
  132. check = idCardNoUtil.checkAddressCode(addressCode);
  133. if (!check) return false;
  134. //校验日期码
  135. var birDayCode = idCardNo.substring(6, 14);
  136. check = idCardNoUtil.checkBirthDayCode(birDayCode);
  137. if (!check) return false;
  138. //验证校检码
  139. return idCardNoUtil.checkParityBit(idCardNo);
  140. },
  141. // 日期格式化
  142. formateDateCN: function(day) {
  143. var yyyy = day.substring(0, 4);
  144. var mm = day.substring(4, 6);
  145. var dd = day.substring(6);
  146. // return yyyy + '-' + mm + '-' + dd;
  147. return yyyy+mm+dd;
  148. },
  149. //获取信息
  150. getIdCardInfo: function(idCardNo) {
  151. var idCardInfo = {
  152. gender: "", //性别
  153. birthday: "" // 出生日期(yyyy-mm-dd)
  154. };
  155. if (idCardNo.length == 15) {
  156. var aday = '19' + idCardNo.substring(6, 12);
  157. idCardInfo.birthday = idCardNoUtil.formateDateCN(aday);
  158. if (parseInt(idCardNo.charAt(14)) % 2 == 0) {
  159. idCardInfo.gender = idCardNoUtil.genders.female;
  160. } else {
  161. idCardInfo.gender = idCardNoUtil.genders.male;
  162. }
  163. } else if (idCardNo.length == 18) {
  164. var aday = idCardNo.substring(6, 14);
  165. idCardInfo.birthday = idCardNoUtil.formateDateCN(aday);
  166. if (parseInt(idCardNo.charAt(16)) % 2 == 0) {
  167. idCardInfo.gender = idCardNoUtil.genders.female;
  168. } else {
  169. idCardInfo.gender = idCardNoUtil.genders.male;
  170. }
  171. }
  172. return idCardInfo;
  173. },
  174. /*18位转15位*/
  175. getId15: function(idCardNo) {
  176. if (idCardNo.length == 15) {
  177. return idCardNo;
  178. } else if (idCardNo.length == 18) {
  179. return idCardNo.substring(0, 6) + idCardNo.substring(8, 17);
  180. } else {
  181. return null;
  182. }
  183. },
  184. /*15位转18位*/
  185. getId18: function(idCardNo) {
  186. if (idCardNo.length == 15) {
  187. var id17 = idCardNo.substring(0, 6) + '19' + idCardNo.substring(6);
  188. var parityBit = idCardNoUtil.getParityBit(id17);
  189. return id17 + parityBit;
  190. } else if (idCardNo.length == 18) {
  191. return idCardNo;
  192. } else {
  193. return null;
  194. }
  195. }
  196. };
  197. export default idCardNoUtil;