/** 

*判断身份证号码格式函数 

*公民身份号码是特征组合码, 

*排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 

*/ 

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.如果校验位不是,则该身份证号码不正确。