工作中需要用到身份证验证,还要支持检查15位和18位。
我一时手懒,问同事有没有现成的函数可用,同事google了一下,扔给我一个asp-vbscript版本的函数。
可我这边是客户端javascript呀,于是用改vbs-->js
改完发现蛮好用的,同时发现vbscript真的很啰嗦,居然写了50多行,我改成js只用了11行。
当然,我并完全是指vbscript啰嗦,那个写这段vbs代码的无名氏也是个唐僧性格.....
先放出vbscript代码,
复制代码 代码如下:
<scriptlanguage="vbscript">
'功能:检查身份证号码
FunctionCheckCardId(e)
arrVerifyCode=Split("1,0,x,9,8,7,6,5,4,3,2",",")
Wi=Split("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2",",")
Checker=Split("1,9,8,7,6,5,4,3,2,1,1",",")
IfLen(e)<15OrLen(e)=16OrLen(e)=17OrLen(e)>18Then
CheckCardId="身份证号共有15码或18位"
CheckCardId=False
ExitFunction
EndIf
DimAi
IfLen(e)=18Then
Ai=Mid(e,1,17)
ElseIfLen(e)=15Then
Ai=e
Ai=Left(Ai,6)&"19"&Mid(Ai,7,9)
EndIf
IfNotIsNumeric(Ai)Then
CheckCardId="身份证除最后一位外,必须为数字!"
ExitFunction
EndIf
DimstrYear,strMonth,strDay
strYear=CInt(Mid(Ai,7,4))
strMonth=CInt(Mid(Ai,11,2))
strDay=CInt(Mid(Ai,13,2))
BirthDay=Trim(strYear)+"-"+Trim(strMonth)+"-"+Trim(strDay)
IfIsDate(BirthDay)Then
IfDateDiff("yyyy",Now,BirthDay)<-140orcdate(BirthDay)>date()Then
CheckCardId="身份证输入错误!"
ExitFunction
EndIf
IfstrMonth>12OrstrDay>31Then
CheckCardId="身份证输入错误!"
ExitFunction
EndIf
Else
CheckCardId="身份证输入错误!"
ExitFunction
EndIf
Dimi,TotalmulAiWi
Fori=0To16
TotalmulAiWi=TotalmulAiWi+CInt(Mid(Ai,i+1,1))*Wi(i)
Next
DimmodValue
modValue=TotalmulAiWiMod11
DimstrVerifyCode
strVerifyCode=arrVerifyCode(modValue)
Ai=Ai&strVerifyCode
CheckCardId=Ai
IfLen(e)=18Ande<>AiThen
CheckCardId="身份证输入错误!"
ExitFunction
EndIf
EndFunction
</script>
再放出javascript版本代码
复制代码 代码如下:
functioncheckId(pId){
//检查身份证号码Go_Rush(阿舜)fromhttp://ashun.cnblogs.com
vararrVerifyCode=[1,0,"x",9,8,7,6,5,4,3,2];
varWi=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
varChecker=[1,9,8,7,6,5,4,3,2,1,1];
if(pId.length!=15&&pId.length!=18)return"身份证号共有15码或18位";
varAi=pId.length==18?pId.substring(0,17):pId.slice(0,6)+"19"+pId.slice(6,16);
if(!/^d+$/.test(Ai))return"身份证除最后一位外,必须为数字!";
varyyyy=Ai.slice(6,10),mm=Ai.slice(10,12)-1,dd=Ai.slice(12,14);
vard=newDate(yyyy,mm,dd),now=newDate();
varyear=d.getFullYear(),mon=d.getMonth(),day=d.getDate();
if(year!=yyyy||mon!=mm||day!=dd||d>now||year<1940)return"身份证输入错误!";
for(vari=0,ret=0;i<17;i++)ret+=Ai.charAt(i)*Wi[i];
Ai+=arrVerifyCode[ret%=11];
returnpId.length==18&&pId!=Ai?"身份证输入错误!":Ai;
};
至于身份证算法的原理,请参阅:http://www.google.com/
最后,根据身份证号码取省份,生日,性别就很简单了
复制代码 代码如下:
<scriptlanguage="javascript">
varid="342201570202003"
//根据身份证取省份,生日,性别Go_Rush(阿舜)fromhttp://ashun.cnblogs.com/
functiongetInfo(id){
vararr=[null,null,null,null,null,null,null,null,null,null,null,"北京","天津","河北","山西","内蒙古"
,null,null,null,null,null,"辽宁","吉林","黑龙江",null,null,null,null,null,null,null,"上海"
,"江苏","浙江","安微","福建","江西","山东",null,null,null,"河南","湖北","湖南","广东","广西","海南"
,null,null,null,"重庆","四川","贵州","云南","西藏",null,null,null,null,null,null,"陕西","甘肃"
,"青海","宁夏","新疆",null,null,null,null,null,"台湾",null,null,null,null,null,null,null,null
,null,"香港","澳门",null,null,null,null,null,null,null,null,"国外"]
id=checkId(id)
if(isNaN(id))return"错误的身份证号码"
varid=String(id),prov=arr[id.slice(0,2)],sex=id.slice(14,17)%2?"男":"女"
varbirthday=(newDate(id.slice(6,10),id.slice(10,12)-1,id.slice(12,14))).toLocaleDateString()
return[prov,birthday,sex]
}
alert(getInfo(id))
</script>
上面的代码只能取到省份,要取到具体城市,请看我的另外一个随笔,
代码只拿我和几个同事的身份证号码测了一下,如果有Bug,请指出