Javascript 驗證身份證字號以及居留証字號

參考網址:https://gist.github.com/twlca/05fe7732a935e2e0937e3aafce8d8a02

參考網址:菜鳥工程師

//身分證字號或外籍人士居留証驗證
/*
 * 第一個字元代表地區,轉換方式為:A轉換成1,0兩個字元,B轉換成1,1……但是Z、I、O分別轉換為33、34、35
 * 第二個字元代表性別,1代表男性,2代表女性
 * 第三個字元到第九個字元為流水號碼。
 * 第十個字元為檢查號碼。
 * 每個相對應的數字相乘,如A123456789代表1、0、1、2、3、4、5、6、7、8,相對應乘上1987654321,再相加。
 * 相加後的值除以模數,也就是10,取餘數再以模數10減去餘數,若等於檢查碼,則驗證通過
 */
function studIdNumberIdentify(nationality, idNumber){
	
	studIdNumber = idNumber.toUpperCase();

	//本國人
	if(nationality == 0){
		
		//驗證填入身分證字號長度及格式
		if(studIdNumber.length != 10){
			alert("長度不足");
			return false;
		}
		//格式,用正則表示式比對第一個字母是否為英文字母
		if(isNaN(studIdNumber.substr(1,9)) || 
				(!/^[A-Z]$/.test(studIdNumber.substr(0,1)))){
			alert("格式錯誤");
			return false;
		}
		
		var idHeader = "ABCDEFGHJKLMNPQRSTUVXYWZIO"; //按照轉換後權數的大小進行排序
		//這邊把身分證字號轉換成準備要對應的
		studIdNumber = (idHeader.indexOf(studIdNumber.substring(0,1))+10) +''+ studIdNumber.substr(1,9);
		//開始進行身分證數字的相乘與累加,依照順序乘上1987654321
		s = parseInt(studIdNumber.substr(0,1)) + 
		parseInt(studIdNumber.substr(1,1)) * 9 + 
		parseInt(studIdNumber.substr(2,1)) * 8 + 
		parseInt(studIdNumber.substr(3,1)) * 7 + 			
		parseInt(studIdNumber.substr(4,1)) * 6 + 
		parseInt(studIdNumber.substr(5,1)) * 5 + 
		parseInt(studIdNumber.substr(6,1)) * 4 + 
		parseInt(studIdNumber.substr(7,1)) * 3 + 
		parseInt(studIdNumber.substr(8,1)) * 2 + 
		parseInt(studIdNumber.substr(9,1));

		checkNum = parseInt(studIdNumber.substr(10,1));
		//模數 - 總和/模數(10)之餘數若等於第九碼的檢查碼,則驗證成功
		//若餘數為0,檢查碼就是0
		if((s % 10) == 0 || (10 - s % 10) == checkNum){
			return true;
		}
		else{
			return false;
		}
		
	}
	//外籍生,居留證號規則跟身分證號差不多,只是第二碼也是英文字母代表性別,跟第一碼轉換二位數字規則相同,但只取餘數
	else{
		
		//驗證填入身分證字號長度及格式
		if(studIdNumber.length != 10){
			alert("長度不足");
			return false;
		}
		//格式,用正則表示式比對第一個字母是否為英文字母
		if(isNaN(studIdNumber.substr(2,8)) || 
				(!/^[A-Z]$/.test(studIdNumber.substr(0,1))) || 
					(!/^[A-Z]$/.test(studIdNumber.substr(1,1)))){
			alert("格式錯誤");
			return false;
		}
		
		var idHeader = "ABCDEFGHJKLMNPQRSTUVXYWZIO"; //按照轉換後權數的大小進行排序
		//這邊把身分證字號轉換成準備要對應的
		studIdNumber = (idHeader.indexOf(studIdNumber.substring(0,1))+10) + 
		'' + ((idHeader.indexOf(studIdNumber.substr(1,1))+10) % 10) + '' + studIdNumber.substr(2,8);
		//開始進行身分證數字的相乘與累加,依照順序乘上1987654321

		s = parseInt(studIdNumber.substr(0,1)) + 
		parseInt(studIdNumber.substr(1,1)) * 9 + 
		parseInt(studIdNumber.substr(2,1)) * 8 + 
		parseInt(studIdNumber.substr(3,1)) * 7 + 			
		parseInt(studIdNumber.substr(4,1)) * 6 + 
		parseInt(studIdNumber.substr(5,1)) * 5 + 
		parseInt(studIdNumber.substr(6,1)) * 4 + 
		parseInt(studIdNumber.substr(7,1)) * 3 + 
		parseInt(studIdNumber.substr(8,1)) * 2 + 
		parseInt(studIdNumber.substr(9,1));

		//檢查號碼 = 10 - 相乘後個位數相加總和之尾數。
		checkNum = parseInt(studIdNumber.substr(10,1));
		//模數 - 總和/模數(10)之餘數若等於第九碼的檢查碼,則驗證成功
		///若餘數為0,檢查碼就是0
		if((s % 10) == 0 || (10 - s % 10) == checkNum){
			return true;
		}
		else{
			return false;
		}
		
	}
	
}

 

新式外來人口統一證號專案

https://www.immigration.gov.tw/5382/5385/5388/7178/225074/

(一) 為建立友善外來人口環境,本署參考歐洲在臺商務協會建議,將舊式統號比照國民身分證字號編碼原則,改版為新式外來人口統一證號(1碼英文+9碼數字,以下簡稱新式統號),格式說明如下:
1. 第1碼:區域碼,依申請地區分,比照國人格式。
2. 第2碼:性別碼,8為男性,9為女性。
3. 第10碼:檢查碼。
(二) 歷經本署自107年起與各機關多次討論,並請總統府、五院及各目的事業主管機關(共計37個機關)盤點自身及所轄公、民營業者之系統修正完畢,本專案已於110年1月2日起實施,開始核發載有新式統號的證件。更多資訊請至本署「新式外來人口統一證號專區」查看(如下方連結)。

https://www.immigration.gov.tw/5385/7445/238440/

本篇發表於 程式設計。將永久鏈結加入書籤。