一. 证件号码校验规则需求
1、 非空
2、 长度
3、 符合相应证件类型号码生成规则,比如居民身份证号必须为十八位阿拉伯数字和英文字母等规则要求。
身份证规则:
1) 18位
2) 前17位号码为数字,18位为数字或X,正则参考:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
3) 第7-14位为出生年月日,日期不能大于当前时间,不能小于1900年
4) 第18位校验码检查,根据前17位数字计算第18位校验码是否正确
a) 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;
b) 将这17位数字和系数相乘的结果相加, 用加出来和除以11,取余
c) 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2
优化前代码
//取当前时间年月日,格式20180713 basedev.empAudit.getDateRangeStr = function nowtime() { //将当前时间转换成yyyymmdd格式 var mydate = new Date(); var str = "" + mydate.getFullYear(); var mm = mydate.getMonth() + 1 if (mydate.getMonth() > 9) { str += mm; } else { str += "0" + mm; } if (mydate.getDate() > 9) { str += mydate.getDate(); } else { str += "0" + mydate.getDate(); } return str; } //证件号码校验规则 Ext.apply(Ext.form.VTypes, { regular_userCardId: function(val, field) { var patt = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/; //判断是否是18位,前17位号码为数字,18位为数字或X if (val.length != 18 || !patt.test(val)) { this.regular_userCardIdText = "身份证长度必须为18位!"; return false; } //第7-14位为出生年月日,日期不能大于当前时间,不能小于1900年 var userCardIdYear = val.substring(6, 10); var userCardIdDay = val.substring(6, 14); if (! (userCardIdYear >= 1900 || basedev.empAudit.getDateRangeStr() < userCardIdDay)) { this.regular_userCardIdText = "身份证号年月日错误!"; return false; } //第18位校验码检查,根据前17位数字计算第18位校验码是否正确 var valStr1 = val.substring(0, 1); var valStr2 = val.substring(1, 2); var valStr3 = val.substring(2, 3); var valStr4 = val.substring(3, 4); var valStr5 = val.substring(4, 5); var valStr6 = val.substring(5, 6); var valStr7 = val.substring(6, 7); var valStr8 = val.substring(7, 8); var valStr9 = val.substring(8, 9); var valStr10 = val.substring(9, 10); var valStr11 = val.substring(10, 11); var valStr12 = val.substring(11, 12); var valStr13 = val.substring(12, 13); var valStr14 = val.substring(13, 14); var valStr15 = val.substring(14, 15); var valStr16 = val.substring(15, 16); var valStr17 = val.substring(16, 17); var valStr18 = val.substring(17, 18); var valRema = (valStr1 * 7 + valStr2 * 9 + valStr3 * 10 + valStr4 * 5 + valStr5 * 8 + valStr6 * 4 + valStr7 * 2 + valStr8 * 1 + valStr9 * 6 + valStr10 * 3 + valStr11 * 7 + valStr12 * 9 + valStr13 * 10 + valStr14 * 5 + valStr15 * 8 + valStr16 * 4 + valStr17 * 2) % 11; switch (valRema) { case 0: if (valStr18 == 1) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 1: if (valStr18 == 0) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 2: if (valStr18 == 'X') { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 3: if (valStr18 == 9) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 4: if (valStr18 == 8) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 5: if (valStr18 == 7) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 6: if (valStr18 == 6) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 7: if (valStr18 == 5) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 8: if (valStr18 == 4) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 9: if (valStr18 == 3) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; case 10: if (valStr18 == 2) { return true; } else { this.regular_userCardIdText = "身份证校验位错误!"; return false; } break; default: return false; } } });
优化后代码
//取当前时间年月日,格式20180713 basedev.empAudit.getDateRangeStr = function nowtime() { var mydate = new Date(); var str = "" + mydate.getFullYear(); var mm = mydate.getMonth() + 1 if (mydate.getMonth() > 9) { str += mm; } else { str += "0" + mm; } if (mydate.getDate() > 9) { str += mydate.getDate(); } else { str += "0" + mydate.getDate(); } return str; } //证件号码校验规则 Ext.apply(Ext.form.VTypes, { regular_userCardId: function (val, field) { var patt = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/; //判断是否是18位,前17位号码为数字,18位为数字或X if (val.length != 18 || !patt.test(val)) { this.regular_userCardIdText = "身份证长度必须为18位!"; return false; } //第7-14位为出生年月日,日期不能大于当前时间,不能小于1900年 var userCardIdYear = val.substring(6, 10); var userCardIdDay = val.substring(6, 14); if (!(userCardIdYear >= 1900 || basedev.empAudit.getDateRangeStr() < userCardIdDay)) { this.regular_userCardIdText = "身份证号年月日错误!"; return false; } //第18位校验码检查,根据前17位数字计算第18位校验码是否正确 var cardArr = val.split(''); var valStr18 = cardArr[17]; var valRema = (cardArr[0] * 7 + cardArr[1] * 9 + cardArr[2] * 10 + cardArr[3] * 5 + cardArr[4] * 8 + cardArr[5] * 4 + cardArr[6] * 2 + cardArr[7] * 1 + cardArr[8] * 6 + cardArr[9] * 3 + cardArr[10] * 7 + cardArr[11] * 9 + cardArr[12] * 10 + cardArr[13] * 5 + cardArr[14] * 8 + cardArr[15] * 4 + cardArr[16] * 2) % 11; var cardArrs = new Array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2); if (cardArrs[valRema] != valStr18) { this.regular_userCardIdText = "身份证校验位错误!"; return false; } else { return true; } } });