快速业务通道

vbscript和javascript版的15位, 18位的身份证号码的验证函数.以及根据身份证取省份,生日,性别

作者 佚名 来源 ASP编程 浏览 发布时间 2013-07-09
工作中需要用到身份证验证,还要支持检查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>

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号