根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
1.将前面的身份证号码17位数分别乘以不同的系数。身份证号码第i位对应的系数为[2^(18-i)] mod 11(此处^代表指数运算)。4.校验码为(12 - y) mod 11 若此结果为10,则以小写字母x代替。
依据身份证号码规则,可以初步获知合法的身份证号所遵循的规则。
身份证号是按号码位划分意义,排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
因此,我们要判断身份证号是否符合意义,目前需要对四个数据进行分析:
1、身份证号码是否存在非数字且非x的符号,长度是否为18位等基础身份证号码校验;
2、身份证号码校验位合法校验;
3、数字地址码合法性校验;
4、出生日期码合法性校验。
设计四个函数,分别解决问题分析之中的四个问题。
仅仅是检测参与组成身份证号码的字符是否合法以及长度是否合法。
///<summary> ///身份证号码组成字符合法性验证 ///<prarm name="pid">身份证号码</param> ///<return>身份证是否合法</return> ///</summary> function check_letter_legal (pid) { //将pid全部小写 pid = pid.toLowerCase(); //获取pid长度 var length = pid.length; //当长度不为18时返回错误 if(length != 18) return false; //遍历pid数组,用于判断是否存在不合法字符 for(var char_loop_pointer = 0; char_loop_pointer < length; char_loop_pointer++) //当存在不合法字符时,即返回错误 if(('0' > pid[char_loop_pointer] || pid[char_loop_pointer] > '9') && (char_loop_pointer != 17 || pid[char_loop_pointer] != 'x')) return false; //全部通过后即返回正确 return true; }
依据下述法则进行验证:
1.将前面的身份证号码17位数分别乘以不同的系数。身份证号码第i位对应的系数为[2^(18-i)] mod 11(此处^代表指数运算)。
2.将这17位数字和系数相乘的结果相加
3.用加出来和除以11,得出余数y。
4.校验码为(12 - y) mod 11 若此结果为10,则以小写字母x代替。
///<summary> ///身份证号码校验位合法性验证 ///<param name="pid">身份证号码</param> ///<return>身份证验证是否合法</return> ///</summary> function check_parity_bit_legal (pid) { //将pid全部小写 pid = pid.toLowerCase(); //校验位 var parity_bit; if(pid[17] == undefined) return false else if(pid[17] == 'x') parity_bit = 10; else parity_bit = parseInt(pid[17]); //校验数组 var check_bit_array = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //相乘和存储器 var sum = 0; for(var add_loop = 0; add_loop < 17; add_loop++){ sum += check_bit_array[add_loop] * parseInt(pid[add_loop]); }; //获得余数 var remainder = sum % 11; //判断校验位合法性 if(parity_bit == (12 - remainder) % 11) return true; else return false; }
目前仅仅检测省份码(因为加县市是在太多了T T)
///<summary> ///地址码合法性验证 ///<param name="pid">身份证号码</param> ///<return>身份证验证是否合法</return> ///</summary> function check_address_code_legal (pid) { //省份码 var province_code={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:"国外"}; //返回省份码并验证 var pid_province_code = pid.substring(0, 2); if(province_code[pid_province_code] == undefined) return false; else return true; }
主要是润平年的问题,以及月份问题
///<summary> ///生日码合法性验证 ///<param name="pid">身份证号码</param> ///<return>身份证是否合法</return> ///</summary> function check_birthday_code_legal (pid) { //获取生日 var year = pid.substring(6, 10); var month = pid.substring(10, 12); var day = pid.substring(12, 14); var month_array = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}; //当为2月时判断是否为闰年 if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) return day <= 29 else return day <= month_array[month]; }
原文地址:http://blog.csdn.net/gscienty/article/details/43307143