老话闲说,关于身份证号码的验证
身份证号码的验证,相信百度一下,一大摞框,在这里我就不说别的了,给你说说我用js简单验证的方法,供参考。
我国的第一代居民身份证是1986年办理的,当时主要由乡镇一级政府组织登记办理,直到上世纪90年代初才开始由公安机关代为管理。
第一代身份证号码由15位数组成,其中前6位数为省、市(地)、县(区)的代码。比如 412825表示河南省驻马店市上蔡县,而随后的660501表示公民的出生年月日既1966年5月1日,这一点跟18位的一个区别(18位表示出生年月日用19660501),而最后的 *** 是3个随机码,且最后一位数字代表公民的性别,男性为单数,女性为偶数。与18位身份证号的另一个区别:没有最后一位的校验码。
18位身份证组成,17位数字+1位校验码,从左至右依次为:6位地址码,8位出生日期码,3位数字顺序码,1位数字校验码:
1、第1位表示地区,第2、3两位组合表示省,自治区,直辖市),第3、4为表示地区(市,州, 盟),第5、6为表示县(旗,镇,区)的名称。
2、出生日期码(第7位至第14位)表示出生的年、月、日;
3、顺序码,表示在同一地址码所标识的区域范围内,对同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性;
4、校验码,是由ISO 7064:1983.MOD11-2校验码计算法得出的,分别为罗马数字 0、1、2、3、4、5、6、7、8、9、x中的某一位;
5、特殊的规定,末尾的 996, 997, 998和 999这四个号为百岁以上老人的特殊规定编号,其他任何人都不会有该编号。
废话不说了,上代码:
function testIdCode(nums) { //nums表示客户端输入的身份证号码 var birth; var num = $.trim(nums.replace(/\s+/g, "")); num = num.toUpperCase(); if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) { alert('输入的身份证号长度不对,或者号码不符合规定!\n身份证号码为15位时,应全为数字,\n身份证号码为18位时,末位可以为数字或X。'); return false; } var len, re; len = num.length; if (len == 15) { //15位身份证号码验证 re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date('19' + arrSplit[2] + '-' + arrSplit[3] + '-' + arrSplit[4]); var bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { //校验出生日期是否合理性 alert('输入的15位身份证号里[出生日期]格式有误!'); return false; } else { birth = '19' + arrSplit[2] + '-' + arrSplit[3] + '-' + arrSplit[4]; } } else if (len == 18) { var year = num.substr(6, 4); var nowDate = new Date(); var nowYear = nowDate.getYear(); if ((nowYear - year) > 112) { //alert("依照输入的身份证出生日期截止到当前,本人已经超过112岁!"); //return false; } re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); var bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert('输入的18位身份证号里[出生日期]格式有误!'); return false; } else { var valnum; var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; for (i = 0; i < 17; i++) { nTemp += num.substr(i, 1) * arrInt[i]; } valnum = arrCh[nTemp % 11]; if (valnum != num.substr(17, 1)) { alert('18位身份证的最后一位最后一位不正确!'); return false; } birth = arrSplit[2] + "-" + arrSplit[3] + "-" + arrSplit[4]; } } else { alert('输入的身份证号码有误,请重新输入!'); return false; } //验证地区是否有效 var aCity = { 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 (aCity[parseInt(num.substr(0, 2))] == null) { alert("输入的身份证号前两位不对!"); return false; } return birth; }
另外一种方式:
假设某一17位身份证数字是
17位数字: 4 1 2 8 2 5 1 9 9 0 1 2 2 3 4 5 4
加权因子: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
计算17位数字各位数字与对应的加权因子的乘积的和S: 4×7+1×9+2×10+8×5+2×8+5×4+1×2+9×1+9×6+0×3+1×7+2×9+2×10+3×5+4×8+5×4+4×2=368;
计算S÷11的余数T:318 %11=10;
(( 余数0-10对应校验码为[1, 0, X , 9, 8, 7, 6, 5, 4, 3, 2],可直接返回,或下面算法 ))
计算(12-T)÷11的余数R,如果R=10,校验码为字母“X”;如果R≠10,校验码为数字“R”:(12-10)%11=2。
该17位数字的校验码就是2,聚合在一为412825199012234542。
回首向来萧瑟处
归去
也无风雨也无晴