JavaScript检验身份证号码

 
 
/**
* 检验身份证号码<br/>
* 15位:ddddddyymmddxxp<br/>
* 18位:ddddddyyyymmddxxxy<br/>
* @param cardNum 身份证号码 string
* @param needAlertError 是否需要弹出错误提示信息
* @return true/false
*/
function checkIDCardNumber ( cardNum , needAlertError ) {
//默认不弹出错误提示信息
needAlertError = !! needAlertError || false ;
if ( typeof cardNum != 'string' ) {
if ( needAlertError ) {
alert ( "参数cardNum格式错误" );
}
return false ;
}
//身份证号码长度为15位或18位
if ( cardNum . length != 15 && cardNum . length != 18 ) {
if ( needAlertError ) {
alert ( "身份证号码位数不对" );
}
return false ;
}
//15位身份证号码全为数字,18位也全为数字或17位数字,并以字符X结尾
if ( ! /^\d{15}$|(^\d{17}[0-9Xx]$)/ . test ( cardNum )) {
if ( needAlertError ) {
alert ( "身份证号码含有非法字符" );
}
return false ;
}
// 地址编码
var province = {
11 : "北京" , 12 : "天津" , 13 : "河北" , 14 : "山西" , 15 : "内蒙古" , 21 : "辽宁" , 22 : "吉林" , 23 : "黑龙江" ,
31 : "上海" , 32 : "江苏" , 33 : "浙江" , 34 : "安徽" , 35 : "福建" , 36 : "江西" , 37 : "山东" , 41 : "河南" ,
42 : "湖北" , 43 : "湖南" , 44 : "广东" , 45 : "广西" , 46 : "海南" , 50 : "重庆" , 51 : "四川" , 52 : "贵州" ,
53 : "云南" , 54 : "西藏" , 61 : "陕西" , 62 : "甘肃" , 63 : "青海" , 64 : "宁夏" , 65 : "新疆" , 71 : "台湾" ,
81 : "香港" , 82 : "澳门" , 91 : "国外" };
if ( ! province [ cardNum . substring ( 0 , 2 )]) {
if ( needAlertError ) {
alert ( "身份证号码地区非法" );
}
return false ;
}
//出生日期
var birthday = cardNum . length == 15 ? ( "19" + cardNum . substring ( 6 , 12 )) : cardNum . substring ( 6 , 14 );
if ( ! /(19)|(20)\d{6}/ . test ( birthday )) {
if ( needAlertError ) {
alert ( "身份证号码出生日期超出范围或格式错误" );
}
return false ;
}
var year = parseInt ( birthday . substring ( 0 , 4 ));
var month = parseInt ( birthday . substring ( 4 , 6 )) - 1 ;
var day = parseInt ( birthday . substring ( 6 ));
var newBirthday = new Date ( year , month , day );
var formatedBirthday = "" + newBirthday . getFullYear ();
formatedBirthday += ( newBirthday . getMonth () < 9 ? "0" : "" ) + ( newBirthday . getMonth () + 1 );
formatedBirthday += ( newBirthday . getDate () < 10 ? "0" : "" ) + newBirthday . getDate ();
//身份证中如包含如下格式的日期将不能通过校验:20150230、20150735
if ( birthday != formatedBirthday ) {
if ( needAlertError ) {
alert ( "身份证号码出生日期超出范围或格式错误" );
}
return false ;
}
//校验位 ∑(ai×Wi)(mod 11)
if ( cardNum . length == 18 ) {
//加权因子
var factor = [ 7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2 ];
//校验位
var parity = [ 1 , 0 , 'X' , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 ];
var sum = 0 ;
for ( var i = 0 ; i < 17 ; i ++ )
{
sum += cardNum [ i ] * factor [ i ];
}
if ( parity [ sum % 11 ] != cardNum [ 17 ]){
if ( needAlertError ) {
alert ( "身份证号码校验位错误" );
}
return false ;
}
}
return true ;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值