<script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>
工作中需要用到身份证验证,还要支持检查15位和18位。
我一时手懒,问同事有没有现成的函数可用,同事google了一下,扔给我一个 asp-vbscript版本的函数。
可我这边是客户端javascript呀,于是用改 vbs-->js
改完发现蛮好用的,同时发现 vbscript真的很啰嗦,居然写了50多行,我改成js 只用了11行。
当然,我并完全是指vbscript啰嗦,那个写这段vbs代码的无名氏也是个唐僧性格.....
先放出 vbscript代码 <script type="text/JavaScript">
</script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script> ,
'功能:检查身份证号码
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版本代码
// 检查身份证号码 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/
最后,根据身份证号码取 省份,生日,性别就很简单了
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请指出
转自:http://www.cnblogs.com/ashun/archive/2007/04/12/idcard-javascript-birthday.html <script type="text/JavaScript">
</script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>