超精准的javascript验证身份证号的具体实现方法
编写程序前先来了解下身份证号的构成:
身份证号分为两种,旧的为15位,新的为18位。
身份证15位编码规则:ddddddyymmddxxp
其中dddddd:地区码 yymmdd:出生年月日 xx:顺序类编码,无法确定 p:性别,奇数为男,偶数为女;
身份证18位编码规则:ddddddyyyymmddxxxy
其中dddddd:地区码 yyyymmdd:出生年月日 xxx:顺序类编码,无法确定,奇数为男,偶数为女 y:校验码,该位数值可通过前17位计算获得,计算的公式见程序,一些需要用到的常数:
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为脚丫校验码所在校验码数组位置。
varWi=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1];//加权因子
varValideCode=[1,0,10,9,8,7,6,5,4,3,2];//身份证验证位值.10代表X
functionIdCardValidate(idCard){
idCard=trim(idCard.replace(//g,""));//去掉字符串头尾空格
if(idCard.length==15){
returnisValidityBrithBy15IdCard(idCard);//进行15位身份证的验证
}elseif(idCard.length==18){
vara_idCard=idCard.split("");//得到身份证数组
if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){//进行18位身份证的基本验证和第18位的验证
returntrue;
}else{
returnfalse;
}
}else{
returnfalse;
}
}
/**
*判断身份证号码为18位时最后的验证位是否正确
*@parama_idCard身份证号码数组
*@return
*/
functionisTrueValidateCodeBy18IdCard(a_idCard){
varsum=0;//声明加权求和变量
if(a_idCard[17].toLowerCase()=='x'){
a_idCard[17]=10;//将最后位为x的验证码替换为10方便后续操作
}
for(vari=0;i<17;i++){
sum+=Wi[i]*a_idCard[i];//加权求和
}
valCodePosition=sum%11;//得到验证码所位置
if(a_idCard[17]==ValideCode[valCodePosition]){
returntrue;
}else{
returnfalse;
}
}
/**
*验证18位数身份证号码中的生日是否是有效生日
*@paramidCard18位书身份证字符串
*@return
*/
functionisValidityBrithBy18IdCard(idCard18){
varyear=idCard18.substring(6,10);
varmonth=idCard18.substring(10,12);
varday=idCard18.substring(12,14);
vartemp_date=newDate(year,parseFloat(month)-1,parseFloat(day));
//这里用getFullYear()获取年份,避免千年虫问题
if(temp_date.getFullYear()!=parseFloat(year)
||temp_date.getMonth()!=parseFloat(month)-1
||temp_date.getDate()!=parseFloat(day)){
returnfalse;
}else{
returntrue;
}
}
/**
*验证15位数身份证号码中的生日是否是有效生日
*@paramidCard1515位书身份证字符串
*@return
*/
functionisValidityBrithBy15IdCard(idCard15){
varyear=idCard15.substring(6,8);
varmonth=idCard15.substring(8,10);
varday=idCard15.substring(10,12);
vartemp_date=newDate(year,parseFloat(month)-1,parseFloat(day));
//对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
if(temp_date.getYear()!=parseFloat(year)
||temp_date.getMonth()!=parseFloat(month)-1
||temp_date.getDate()!=parseFloat(day)){
returnfalse;
}else{
returntrue;
}
}
//去掉字符串头尾空格
functiontrim(str){
returnstr.replace(/(^\s*)|(\s*$)/g,"");
}
 根据身份证号对其进行性别的判定
/**
*通过身份证判断是男是女
*@paramidCard15/18位身份证号码
*@return'female'-女、'male'-男
*/
functionmaleOrFemalByIdCard(idCard){
idCard=trim(idCard.replace(//g,""));//对身份证号码做处理。包括字符间有空格。
if(idCard.length==15){
if(idCard.substring(14,15)%2==0){
return'female';
}else{
return'male';
}
}elseif(idCard.length==18){
if(idCard.substring(14,17)%2==0){
return'female';
}else{
return'male';
}
}else{
returnnull;
}
}
以上就是javascript验证身份证号的具体实现方法,并且根据身份证能验证性别,是不是很神奇,欢迎大家学习借鉴。
