javascript for validate ID number(18 digit or 15 digit)
/*** 身份证15位编码规则:dddddd yymmdd xx p* dddddd:地区码* yymmdd: 出生年月日* xx: 顺序类编码,无法确定* p: 性别,奇数为男,偶数为女* <p />* 身份证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, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]* 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )* i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置**/function len(s) {var l = 0;var a = s.split("");for (var i=0;i<a.length;i++) {if (a[i].charCodeAt(0)<299) {l++;} else {l+=2;}}return l;}var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值.10代表Xfunction IdCardValidate(idCard) {idCard = trim(idCard.replace(/ /g, ""));if (idCard.length == 15) {return isValidityBrithBy15IdCard(idCard);} else if (idCard.length == 18) {var a_idCard = idCard.split("");// 得到身份证数组if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){return true;}else {return false;}} else {return false;}}/*** 判断身份证号码为18位时最后的验证位是否正确* @param a_idCard 身份证号码数组* @return*/function isTrueValidateCodeBy18IdCard(a_idCard) {var sum = 0; // 声明加权求和变量if (a_idCard[17].toLowerCase() == 'x') {a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作}for ( var i = 0; i < 17; i++) {sum += Wi[i] * a_idCard[i];// 加权求和}valCodePosition = sum % 11;// 得到验证码所位置if (a_idCard[17] == ValideCode[valCodePosition]) {return true;} else {return false;}}/*** 通过身份证判断是男是女* @param idCard 15/18位身份证号码* @return 'female'-女、'male'-男*/function maleOrFemalByIdCard(idCard){idCard = trim(idCard.replace(/ /g, ""));// 对身份证号码做处理。包括字符间有空格。if(idCard.length==15){if(idCard.substring(14,15)%2==0){return 'female';}else{return 'male';}}else if(idCard.length ==18){if(idCard.substring(14,17)%2==0){return 'female';}else{return 'male';}}else{return null;}// 可对传入字符直接当作数组来处理// if(idCard.length==15){// alert(idCard[13]);// if(idCard[13]%2==0){// return 'female';// }else{// return 'male';// }// }else if(idCard.length==18){// alert(idCard[16]);// if(idCard[16]%2==0){// return 'female';// }else{// return 'male';// }// }else{// return null;// }}/*** 验证18位数身份证号码中的生日是否是有效生日* @param idCard 18位书身份证字符串* @return*/function isValidityBrithBy18IdCard(idCard18){var year = idCard18.substring(6,10);var month = idCard18.substring(10,12);var day = idCard18.substring(12,14);var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));// 这里用getFullYear()获取年份,避免千年虫问题if(temp_date.getFullYear()!=parseFloat(year)||temp_date.getMonth()!=parseFloat(month)-1||temp_date.getDate()!=parseFloat(day)){return false;}else{return true;}}/*** 验证15位数身份证号码中的生日是否是有效生日* @param idCard15 15位书身份证字符串* @return*/function isValidityBrithBy15IdCard(idCard15){var year = idCard15.substring(6,8); &n补充:web前端 , JavaScript ,
上一个:AJAX jQuery tab选项卡
下一个:js防止表单重复提交
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- jsp+javaBean中Column 'ordersPrice' specified twice的错误
- Java TCP/IP Socket网络编程系列
- 大家来讨论一下我到底该用什么好?Swing 还是 JavaFX
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- spring 获取上下文问题
- SSH 导入导出excel 谁有这块的资料吗?
- Ext TreePanel 刷新问题
- springmvc 加载一个jsp页面执行多个方法 报404
- checkbox数组action怎么向页面传值