这段时间,公司进行的项目需要用到一些个人证件和企业证件的校验,参考了一些网上的代码,其实现在很多的规则都已经被大佬们编写出来,并且正常使用.所以在网上搜集了一些资料.经过一些修改,大部分都能直接用了,唯独少了中征码的校验.在此之前,我其实也不知道啥叫中征码.
不过呢,管他是啥,有规则就成.话不多说直接上代码.
先提一嘴校验规则
上图为计算规则以及字母对应的机器码值.
下面上代码:
function checkZZM(value){
/*
* 公司给到我的规则为:
* 编码长度应为 16 位;
* 第 1 到 3 位应为字母或者数字;
* 第 4-14 位应为数字;
* 校验位(最后两位)符合校验规则,下公式
* (符号打不出来... 就是对前14位值乘以加权因子,最后对97取余再+1)
* A=1+MOD(∑Ci x Wi,97)
*/
//先定义正则,前三位为字母或数字, 4-16位为数字,最后两位为校验码
var reg = /^[A-Z0-9]{3}[0-9]{4,16}$/;
var re = new RegExp(reg);
if(!re.test(value)){
return false;
}
//最后两位校验码
var code = value.substring(14,16);
//前14位序号值
var idCode = value.substring(0,14);
// 加权因子(固定)
var weight_factor = [1,3,5,7,11,2,13,1,1,17,19,97,23,29];
var arr = idCode.split("");
var len = arr.length;
var num = 0;
for(var i = 0; i < len; i++){
if(arr[i]>="A" && arr[i]<="Z"){
//第一次觉得js比java好写.因为java还要转类型转来转去...js多好 直接用就好了
arr[i] = enToNumberFun(arr[i])
}
//计算总和
num = num + arr[i] * weight_factor[i];
}
// 获取余数
var resisue = num%97+1;
//因为校验位是两位,则如果最后的余数只有一位的话,还要补一个0
if(resisue<10){
resisue = "0" + resisue;
}
//校验位和余数相等则校验通过
if((resisue == code)){
return true;
}
return false;
}
//将大写字母的值转换为机器处理用代码字符数值(只考虑大写)
function enToNumberFun(val){
var b = val.charCodeAt()-55;
return b;
}
这样输入一串字符,就可以验证啦.
ASD1234567891473 这样就是一个按上述规则验证为合理的中征码啦.
还写了一份java版的,待会上传,希望有大神看到哪里写的不合理或者可优化的地方,可以联系我,谢谢!!!
好记性不如烂笔头,加油!