JavaScript验证身份证

  /**
*判断身份证号码格式函数
*公民身份号码是特征组合码,
*排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码
*/
function isChinaIDCard(StrNo){   
  StrNo = StrNo.toString();
  if(StrNo.length == 15){        
   if(!isValidDate("19"+StrNo.substr(6,2),StrNo.substr(8,2),StrNo.substr(10,2))){return false;}      
  }else if(StrNo.length == 18){     
   if (!isValidDate(StrNo.substr(6,4),StrNo.substr(10,2),StrNo.substr(12,2))){return false;}   
   }else{   
   alert("输入的身份证号码必须为15位或者18位!");   
   return false;
   }
  
  if (StrNo.length==18)   
  {   
var a,b,c   
if (!isNumber(StrNo.substr(0,17))){alert("身份证号码错误,前17位不能含有英文字母!");return false;}   
a=parseInt(StrNo.substr(0,1))*7+parseInt(StrNo.substr(1,1))*9+parseInt(StrNo.substr(2,1))*10;   
a=a+parseInt(StrNo.substr(3,1))*5+parseInt(StrNo.substr(4,1))*8+parseInt(StrNo.substr(5,1))*4;   
a=a+parseInt(StrNo.substr(6,1))*2+parseInt(StrNo.substr(7,1))*1+parseInt(StrNo.substr(8,1))*6;     
a=a+parseInt(StrNo.substr(9,1))*3+parseInt(StrNo.substr(10,1))*7+parseInt(StrNo.substr(11,1))*9;     
a=a+parseInt(StrNo.substr(12,1))*10+parseInt(StrNo.substr(13,1))*5+parseInt(StrNo.substr(14,1))*8;     
a=a+parseInt(StrNo.substr(15,1))*4+parseInt(StrNo.substr(16,1))*2;   
b=a%11;   
if (b==2)   //最后一位为校验位   
{   
  c=StrNo.substr(17,1).toUpperCase();   //转为大写X   
}   
else   
{   
  c=parseInt(StrNo.substr(17,1));   
}   
switch(b)   
{   
  case 0: if ( c!=1 ) {alert("身份证好号码校验位错:最后一位应该为:1");return false;}break;   
  case 1: if ( c!=0 ) {alert("身份证好号码校验位错:最后一位应该为:0");return false;}break;   
  case 2: if ( c!="X") {alert("身份证好号码校验位错:最后一位应该为:X");return false;}break;   
  case 3: if ( c!=9 ) {alert("身份证好号码校验位错:最后一位应该为:9");return false;}break;   
  case 4: if ( c!=8 ) {alert("身份证好号码校验位错:最后一位应该为:8");return false;}break;   
  case 5: if ( c!=7 ) {alert("身份证好号码校验位错:最后一位应该为:7");return false;}break;   
  case 6: if ( c!=6 ) {alert("身份证好号码校验位错:最后一位应该为:6");return false;}break;   
  case 7: if ( c!=5 ) {alert("身份证好号码校验位错:最后一位应该为:5");return false;}break;   
  case 8: if ( c!=4 ) {alert("身份证好号码校验位错:最后一位应该为:4");return false;}break;   
  case 9: if ( c!=3 ) {alert("身份证好号码校验位错:最后一位应该为:3");return false;}break;   
  case 10: if ( c!=2 ){alert("身份证好号码校验位错:最后一位应该为:2");return false;}   
}   
  } else {//15位身份证号   
if (!isNumber(StrNo)) {alert("身份证号码错误,前15位不能含有英文字母!");return false;}     
  }  
  return true;

}   
    
  function isValidDate(iY, iM, iD) {
   if (iY>2200 || iY<1900 || !isNumber(iY)){
            alert("输入身份证号,年度"+iY+"非法!");
            return false;
        }
   if (iM>12 || iM<=0 || !isNumber(iM)){
            alert("输入身份证号,月份"+iM+"非法!");
            return false;
        }
   if (iD>31 || iD<=0 || !isNumber(iD)){
            alert("输入身份证号,日期"+iD+"非法!");
            return false;
        }
  return true;
  }  
/**
* 验证是不是数字
*/
function isNumber(oNum) { 
  if(!oNum) return false; 
  var strP=/^/d+(/./d+)?$/; 
  if(!strP.test(oNum)) return false; 
  try{ 
  if(parseFloat(oNum)!=oNum) return false; 
  } 
  catch(ex) 
  { 
   return false; 
  } 
  return true; 
}


---身份证号码的规则

1、15位身份证号码组成:
ddddddyymmddxxs共15位,其中:
dddddd为6位的地方代码,根据这6位可以获得该身份证号所在地。
yy为2位的年份代码,是身份证持有人的出身年份。
mm为2位的月份代码,是身份证持有人的出身月份。
dd为2位的日期代码,是身份证持有人的出身日。
这6位在一起组成了身份证持有人的出生日期。
xx为2位的顺序码,这个是随机数。
s为1位的性别代码,奇数代表男性,偶数代表女性。

2、18位身份证号码组成:
ddddddyyyymmddxxsp共18位,其中:
其他部分都和15位的相同。年份代码由原来的2位升级到4位。最后一位为校验位。
校验规则是:
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11)
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2


也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值