您的位置:首页 > Web前端 > JavaScript

Javascript身份证号校验

2008-11-27 11:51 330 查看
/**
*判断身份证号码格式函数
*公民身份号码是特征组合码,
*排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码
*/
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.如果校验位不是,则该身份证号码不正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript c im function