身份证号码的验证函数.以及根据身份证取省份,生日,性别

<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> ,  

< 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 ) - ,  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请指出
转自: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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值