CardIDValidationService.js 5.65 KB
Newer Older
frank.xa.zhang's avatar
frank.xa.zhang committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
vatModule.service('cardValidationService', ['$log','$translate',
    function ($log, $translate) {
    var checkCard = function (card) {
        var result = {
            pass: true,
            message: ''
        };
            //是否为空  
            if (card==undefined||card==null||card=="") {
                result.message = $translate.instant('BuyerCodePlaceholder');
                result.pass = false;
                return result;
            }
            //校验长度,类型  
            if (!isCardNo(card)) {
                result.message = $translate.instant('LengthNotEqual')+" 18 or "+$translate.instant("CarIDTypeError");
                result.pass = false;
                return result;
            }
            //检查省份  
            if (!checkProvince(card)) {
                result.message = $translate.instant('CardCountryValidationError');
                result.pass = false;
                return result;
            }
            //校验生日  
            if (!checkBirthday(card)) {
                result.message = $translate.instant('CardDateValidationError');
                result.pass = false;
                return result;
            }
            //检验位的检测  
            if (!checkParity(card)) {
                result.message = $translate.instant('CardCheckCodeValidationError');
                result.pass = false;
                return result;
            }
           
            return result;
        };


        //检查号码是否符合规范,包括长度,类型  
       var isCardNo = function (card) {
            //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X  
           // var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
           var reg = /(^\d{17}(\d|X)$)/;
            if (reg.test(card) === false) {
                return false;
            }

            return true;
        };

        //取身份证前两位,校验省份  
       var checkProvince = function (card) {
            var province = card.substr(0, 2);
            if (constant.vcity[province] == undefined) {
                return false;
            }
            return true;
        };

        //检查生日是否正确  
       var checkBirthday = function (card) {
            var len = card.length;
            //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字  
            if (len == '15') {
                var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
                var arr_data = card.match(re_fifteen);
                var year = arr_data[2];
                var month = arr_data[3];
                var day = arr_data[4];
                var birthday = new Date('19' + year + '/' + month + '/' + day);
                return verifyBirthday('19' + year, month, day, birthday);
            }
            //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X  
            if (len == '18') {
                var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
                var arr_data = card.match(re_eighteen);
                var year = arr_data[2];
                var month = arr_data[3];
                var day = arr_data[4];
                var birthday = new Date(year + '/' + month + '/' + day);
                return verifyBirthday(year, month, day, birthday);
            }
            return false;
        };

        //校验日期  
       var verifyBirthday = function (year, month, day, birthday) {
            var now = new Date();
            var now_year = now.getFullYear();
            //年月日是否合理  
            if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) {
                //判断年份的范围(3岁到100岁之间)  
                var time = now_year - year;
                if (time >= 3 && time <= 100) {
                    return true;
                }
                return false;
            }
            return false;
        };

        //校验位的检测  
       var checkParity = function (card) {
            //15位转18位  
            card = changeFivteenToEighteen(card);
            var len = card.length;
            if (len == '18') {
                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 cardTemp = 0, i, valnum;
                for (i = 0; i < 17; i++) {
                    cardTemp += card.substr(i, 1) * arrInt[i];
                }
                valnum = arrCh[cardTemp % 11];
                if (valnum == card.substr(17, 1)) {
                    return true;
                }
                return false;
            }
            return false;
        };

        //15位转18位身份证号  
       var changeFivteenToEighteen = function (card) {
            if (card.length == '15') {
                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 cardTemp = 0, i;
                card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
                for (i = 0; i < 17; i++) {
                    cardTemp += card.substr(i, 1) * arrInt[i];
                }
                card += arrCh[cardTemp % 11];
                return card;
            }
            return card;
        };
        return {
            CardCheck: checkCard
        }
    }]);