当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > vbscript和javascript版的15位, 18位的身份证号码的验证函数.以及根据身份证取省份,生日,性别

VBScript
一个实现VBS倒计时的代码
用vbs实现将剪切板的unix格式的内容处理成pc格式的代码
用vb和vbs 破解flashxp的密码的代码
用VBS实现的批量gb2312转utf-8,支持拖动
用vbs实现的XP序列号替换器
VBS可以做什么的简单说明
用vbs实现cmd功能的代码
VBS基础编程教程 (第1篇)
VBS基础编程教程 (第3篇)
VBS基础编程教程 (第4篇)
VBS基础编程教程 (第5篇)
VBS基础编程教程 (第6篇)
利用vbscript的for命令实现定时关机
在桌面右下角出现温馨提示的vbs冒泡程序
利用VBS发送邮件 挑选速度快的肉鸡做VPN 的vbs代码
vbs教程 chm下载
用vbs实现的简单的服务器文件备份办法压缩文件名自动按日期命名
输入mdb数据库即可将打包的mdb文件解包
VBS编程教程第一部
vbs脚本 加密 几个小细节小结下

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 46 ::
收藏到网摘: n/a

工作中需要用到身份证验证,还要支持检查15位和18位。
我一时手懒,问同事有没有现成的函数可用,同事google了一下,扔给我一个 asp-vbscript版本的函数。
可我这边是客户端javascript呀,于是用改 vbs-->js
改完发现蛮好用的,同时发现 vbscript真的很啰嗦,居然写了50多行,我改成js 只用了11行。
当然,我并完全是指vbscript啰嗦,那个写这段vbs代码的无名氏也是个唐僧性格.....
先放出 vbscript代码,
复制代码 代码如下:

<script language="vbscript">
'功能:检查身份证号码
Function CheckCardId(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", ",")
If Len(e) < 15 Or Len(e) = 16 Or Len(e) = 17 Or Len(e) > 18 Then
CheckCardId= "身份证号共有 15 码或18位"
CheckCardId = False
Exit Function
End If
Dim Ai
If Len(e) = 18 Then
Ai = Mid(e, 1, 17)
ElseIf Len(e) = 15 Then
Ai = e
Ai = Left(Ai, 6) & "19" & Mid(Ai, 7, 9)
End If
If Not IsNumeric(Ai) Then
CheckCardId= "身份证除最后一位外,必须为数字!"
Exit Function
End If
Dim strYear, 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)
If IsDate(BirthDay) Then
If DateDiff("yyyy",Now,BirthDay)<-140 or cdate(BirthDay)>date() Then
CheckCardId= "身份证输入错误!"
Exit Function
End If
If strMonth > 12 Or strDay > 31 Then
CheckCardId= "身份证输入错误!"
Exit Function
End If
Else
CheckCardId= "身份证输入错误!"
Exit Function
End If
Dim i, TotalmulAiWi
For i = 0 To 16
TotalmulAiWi = TotalmulAiWi + CInt(Mid(Ai, i + 1, 1)) * Wi(i)
Next
Dim modValue
modValue = TotalmulAiWi Mod 11
Dim strVerifyCode
strVerifyCode = arrVerifyCode(modValue)
Ai = Ai & strVerifyCode
CheckCardId = Ai
If Len(e) = 18 And e <> Ai Then
CheckCardId= "身份证输入错误!"
Exit Function
End If
End Function
</script>

再放出 javascript版本代码
复制代码 代码如下:

function checkId(pId){
//检查身份证号码 Go_Rush(阿舜) from http://ashun.cnblogs.com
var arrVerifyCode = [1,0,"x",9,8,7,6,5,4,3,2];
var Wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
var Checker = [1,9,8,7,6,5,4,3,2,1,1];
if(pId.length != 15 && pId.length != 18) return "身份证号共有 15 码或18位";
var Ai=pId.length==18 ? pId.substring(0,17) : pId.slice(0,6)+"19"+pId.slice(6,16);
if (!/^\d+$/.test(Ai)) return "身份证除最后一位外,必须为数字!";
var yyyy=Ai.slice(6,10) , mm=Ai.slice(10,12)-1 , dd=Ai.slice(12,14);
var d=new Date(yyyy,mm,dd) , now=new Date();
var year=d.getFullYear() , mon=d.getMonth() , day=d.getDate();
if (year!=yyyy || mon!=mm || day!=dd || d>now || year<1940) return "身份证输入错误!";
for(var i=0,ret=0;i<17;i++) ret+=Ai.charAt(i)*Wi[i];
Ai+=arrVerifyCode[ret %=11];
return pId.length ==18 && pId != Ai?"身份证输入错误!":Ai;
};

至于身份证算法的原理,请参阅: http://www.google.com/
最后,根据身份证号码取 省份,生日,性别就很简单了
复制代码 代码如下:

<script language="javascript">
var id="342201570202003"
//根据身份证取 省份,生日,性别 Go_Rush(阿舜) from http://ashun.cnblogs.com/
function getInfo(id){
var arr=[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 "错误的身份证号码"
var id=String(id), prov=arr[id.slice(0,2)] , sex=id.slice(14,17)%2? "男" : "女"
var birthday=(new Date(id.slice(6,10) , id.slice(10,12)-1 , id.slice(12,14))).toLocaleDateString()
return [prov,birthday,sex]
}
alert(getInfo(id))
</script>

上面的代码只能取到省份,要取到具体城市,请看我的另外一个随笔,
代码只拿我和几个同事的身份证号码测了一下,如果有Bug,请指出