这段时间,公司进行的项目需要用到一些个人证件和企业证件的校验,参考了一些网上的代码,其实现在很多的规则都已经被大佬们编写出来,并且正常使用.所以在网上搜集了一些资料.经过一些修改,大部分都能直接用了,唯独少了中征码的校验.在此之前,我其实也不知道啥叫中征码.
不过呢,管他是啥,有规则就成.话不多说直接上代码.
先提一嘴校验规则
上图为计算规则以及字母对应的机器码值.
下面上代码:
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;//因为校验位是两位,则如果最后的余数只有一位的话,还要补一个0if(resisue<10){resisue = "0" + resisue;}//校验位和余数相等则校验通过if((resisue == code)){return true;}return false;
}
//将大写字母的值转换为机器处理用代码字符数值(只考虑大写)
function enToNumberFun(val){var b = val.charCodeAt()-55;return b;
}
这样输入一串字符,就可以验证啦.
ASD1234567891473 这样就是一个按上述规则验证为合理的中征码啦.
还写了一份java版的,待会上传,希望有大神看到哪里写的不合理或者可优化的地方,可以联系我,谢谢!!!
好记性不如烂笔头,加油!