這段時間,公司進行的項目需要用到一些個人證件和企業證件的校驗,參考了一些網上的代碼,其實作在很多的規則都已經被大佬們編寫出來,并且正常使用.是以在網上搜集了一些資料.經過一些修改,大部分都能直接用了,唯獨少了中征碼的校驗.在此之前,我其實也不知道啥叫中征碼.
不過呢,管他是啥,有規則就成.話不多說直接上代碼.
先提一嘴校驗規則
上圖為計算規則以及字母對應的機器碼值.
下面上代碼:
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版的,待會上傳,希望有大神看到哪裡寫的不合理或者可優化的地方,可以聯系我,謝謝!!!
好記性不如爛筆頭,加油!