判断是否是身份证

2020-08-25  本文已影响0人  小进我是爸爸
function ChinaIdChecker(id) {
        this.isOK = false;
        this.error = '';

        if (!id || typeof (id) != 'string' || id.length != 15 && id.length != 18
                || !id.match(/^[0-9]{15}$/) && !id.match(/^[0-9]{17}[0-9xX]$/) || "111111111111111" == id) {
                this.error = '输入不是15位或者18位有效字符串';
                return false;
                }

        var area = {
                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 : "国外"
                };

        this.areaName = area[id.substr(0, 2)];
        if (!this.areaName) {
                this.error = '前2位不是有效的行政区划代码';
                return false;
                }
        ;

        if (id.length == 15) {
                this.year = parseInt(id.substr(6, 2));
                this.month = parseInt(id.substr(8, 2));
                this.day = parseInt(id.substr(10, 2));
                }
     else {
                this.year = parseInt(id.substr(6, 4));
                this.month = parseInt(id.substr(10, 2));
                this.day = parseInt(id.substr(12, 2));
                }

        this.error = '出生日期不正确';
        if (this.month > 12) {
                return false;
                }
        if (this.day > 31) {
                return false;
                }
        // February can't be greater than 29 (leap year calculation comes later)
        if ((this.month == 2) && (this.day > 29)) {
                return false;
                }
        // check for months with only 30 days
        if ((this.month == 4) || (this.month == 6) || (this.month == 9)
                || (this.month == 11)) {
                if (this.day > 30) {
                        return false;
                            }
                }
        // if 2-digit year, use 50 as a pivot date
        if (this.year < 100) {
                this.year += 1900;
                }
        if (this.year > 9999) {
                return false;
                }
        // check for leap year if the month and day is Feb 29
        if ((this.month == 2) && (this.day == 29)) {
                var div4 = this.year % 4;
                var div100 = this.year % 100;
                var div400 = this.year % 400;
                // if not divisible by 4, then not a leap year so Feb 29 is invalid
                if (div4 != 0) {
                        return false;
                            }
                // at this point, year is divisible by 4. So if year is divisible by
                // 100 and not 400, then it's not a leap year so Feb 29 is invalid
                if ((div100 == 0) && (div400 != 0)) {
                        return false;
                            }
                }
        this.yearStr = '' + this.year;
        this.monthStr = (this.month < 10 ? '0' : '') + this.month;
        this.dayStr = (this.day < 10 ? '0' : '') + this.day;

        // date is valid
        var birthDay = new Date(this.year, this.month - 1, this.day);

        if (birthDay - new Date() >= 0 || birthDay - new Date(1850, 1, 1) <= 0) {
                return false;
                }

        this.error = '';
        var lastNum = id.length == '15' ? id.substr(14, 1) : id.substr(16, 1);
        this.sex = (lastNum == '1' || lastNum == '3' || lastNum == '5'
                || lastNum == '7' || lastNum == '9') ? '1' : '0';
        this.sexName = this.sex == '1' ? '男' : '女';
        if (id.length == '15') {
                this.isOK = true;
                return true;
                }

        var getLastValidationLetter = function(str) {
                var strArray = new Array(17); 
        // 存储身份证的前17为数字
                var Wi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,
                        1); 
        // 表示第i位置上的加权因子
                var Y = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 
        // 校验码值
                var S = 0; 
        // 十七位数字本体码加权求和
                var jym = 0; 
        // 校验码

                for ( var i = 16; 
        i >= 0; 
        i -= 1) {
                        strArray[i] = Number(str.charAt(i));
                            }

                for ( var j = 16; 
        j >= 0; 
        j -= 1) {
                        S += strArray[j] * Wi[j];
                            }

                jym = S % 11;
                return Y[jym];
                };

        if (id.substr(17, 1) != getLastValidationLetter(id.substr(0, 17))) {
                this.error = '18位身份证编码最后一位校验码不正确';
                return false;
                }

        this.isOK = true;
        return true;
    }

上一篇下一篇

猜你喜欢

热点阅读