-
-
Save cn27529/98650c73e6ab4085af2ee5303485684f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//身分證字號或外籍人士居留証驗證 | |
/* | |
* 第一個字元代表地區,轉換方式為: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; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment