码迷,mamicode.com
首页 > 编程语言 > 详细

javascript验证身份证

时间:2015-01-30 22:56:16      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:javascript   身份证号码验证   

身份证规则

根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

1.将前面的身份证号码17位数分别乘以不同的系数。身份证号码第i位对应的系数为[2^(18-i)] mod 11(此处^代表指数运算)。
2.将这17位数字和系数相乘的结果相加
3.用加出来和除以11,得出余数y。

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];
}

javascript验证身份证

标签:javascript   身份证号码验证   

原文地址:http://blog.csdn.net/gscienty/article/details/43307143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!