
今天,一位客户报告说该用户ID无法输入字母“ X”. 让我看看发生了什么. 看到客户发送的屏幕截图,结果只能输入数字. 这种修改很简单,更不用说打开代码了,因为该代码是由同事编写的,我仔细地看了一下,我的心突然变得发冷,js层没有进行验证,而后台也没有进行验证,因此无法使用. ..更改它!
数字识别
ID卡的编码规则如下: 根据《中华人民共和国国家标准GB11643-1999》中有关公民ID号码的规定,公民ID号是由17位数字组成的特征性组合代码. 代码和一位验证码组成.

顺序码(的15到17位数字)是县和区政府管辖下的派出所分配的代码. 每个派出所分配的代码是10个连续的数字,例如“ 000-009”或“ 060” -069”,其中单数是男性分配代码,偶数是女性分配代码. 两个人在同一天号省份代码,同一月和同一天,第二,第三,第四和第五个分配代码将被扩展. 例如: 005是男孩,并且至少有两个男孩在同一年出生,月份和日期,最后四个是001和003. 分配的序列号中的四个序列号“ 999、998、997、996”是针对一百岁以上的男性和女性的特定编号.
校验码(ID卡的最后一位)是根据前17位数字和ISO7064: 1983.MOD11-2校验码计算出的校验码.
从1999年10月1日起,实施国家号码系统,号码从15个增加到18个. 前6位数字是地址码;第7到14位数字是出生日期代码,该代码从6位数字更改为8位数字,其中年份由4位数字表示;第15到第17位数字是已取消的序号. 序号中百岁老人使用的特定数字;第18位是校验码,主要用于验证计算机输入的公民ID号的前17位是否正确. 值的范围是0到10. 等于10时,用罗马数字X表示. 计算方法
2.1用不同的系数乘以前一个号的17位数字. 从第一位到第十七位的系数是: 7-9-10-5-5-8-4-2-2-1-6-3-7-9-10-5-8-4-2.
2.2将这17位数字与系数相乘的结果相加.
2.3使用加法并除以11可以看到余数是什么?

2.3余数只能有11个数字,例如0-1-2-3-4-5-6-7-8-9-10. 与其对应的最后一个ID卡的编号为1-0-X-9-9-8-7-6-6-5-4-2-3. (也就是说,余数0对应于1,余数1对应于0,余数2对应于X ...)
2.5从上面我们可以知道,如果余数为3,则ID卡的第18位将显示9. 如果对应的数字为2,则ID卡的最后一位数字为罗马数字X.
例如: 一个男人的号码是[53010219200508011X],让我们看看该是否符合计算规则?

首先,我们获得前17位的乘积和[(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26) +(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1 * 2)]为189,然后将189除以11,结果为189÷11 = 17,剩余的2号省份代码,187÷11 = 17,剩余的2无法除,表示剩余数为2. 最后,通过相应的规则,您可以知道与剩余的2相对应的校验码为X. 因此,可以确定这是正确的ID号.
以上内容来自百度百科!
当前,ID号码基本上是18位数字,但也有15位数字.
ID号为15位数字时,均为数字. 当它是18位数字时,前17位数字都是数字,下一个是校验位,可以是数字或字母X.
现在您知道ID号码的组成原理,该代码更容易编写,没有太多废话,并且代码(以js代码为例):
//验证号码
function IdentityIDCard(code){
//号前两位代表区域
var city = {
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 idCardReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
var idCardReg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;
var errorMessage = "";//错误提示信息
var isPass = true;//验证是否通过(true通过、false未通过)
//如果不满足格式正则表达式
if (!code || !code.match(reg)) {
errorMess = "您输入的号码有误!";
isPass = false;
}
//区域数组中不包含需验证的前两位
else if (!city[code.substr(0, 2)]) {
errorMess = "您输入的号码有误!";
isPass = false;
}
else {
//18位需要验证最后一位校验位
if (code.length == 18) {
code = code.split('');
//∑(ai×Wi)(mod 11)
//加权因子
var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
//校验位
var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
var sum = 0;
var ai = 0;
var wi = 0;
for (var i = 0; i < 17; i++) {
ai = code[i];
wi = factor[i];
sum += ai * wi; //开始计算并相加
}
var last = parity[sum % 11]; //求余
if (parity[sum % 11] != code[17]) {
errorMess = "您输入的号码有误!";
isPass = false;
}
}
}
var returnParam = {
'errorMess': errorMess,
'isPass': isPass
}
return returnParam;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-284524-1.html
凡凡