天天看點

JS企業中征碼證件校驗正則

    這段時間,公司進行的項目需要用到一些個人證件和企業證件的校驗,參考了一些網上的代碼,其實作在很多的規則都已經被大佬們編寫出來,并且正常使用.是以在網上搜集了一些資料.經過一些修改,大部分都能直接用了,唯獨少了中征碼的校驗.在此之前,我其實也不知道啥叫中征碼.

     不過呢,管他是啥,有規則就成.話不多說直接上代碼.

 先提一嘴校驗規則

JS企業中征碼證件校驗正則
JS企業中征碼證件校驗正則
JS企業中征碼證件校驗正則

上圖為計算規則以及字母對應的機器碼值.

下面上代碼:

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版的,待會上傳,希望有大神看到哪裡寫的不合理或者可優化的地方,可以聯系我,謝謝!!!

好記性不如爛筆頭,加油!