Created
October 14, 2016 06:15
-
-
Save twlca/05fe7732a935e2e0937e3aafce8d8a02 to your computer and use it in GitHub Desktop.
檢查身分證字號
This file contains hidden or 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
/* 依據內政部: | |
1. 身分證編碼原則 | |
2. 外來人口統一證號編碼原則(居留證) https://www.immigration.gov.tw/ct_cert.asp?xItem=1106801&ctNode=32601&mp=1 | |
身分證及居留證通用 | |
第一碼 縣市編碼原則: | |
A=10 台北市 J=18 新竹縣 S=26 高雄縣 | |
B=11 台中市 K=19 苗栗縣 T=27 屏東縣 | |
C=12 基隆市 L=20 台中縣 U=28 花蓮縣 | |
D=13 台南市 M=21 南投縣 V=29 台東縣 | |
E=14 高雄市 N=22 彰化縣 W=32 金門縣 | |
F=15 台北縣 O=35 新竹市 X=30 澎湖縣 | |
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山 | |
H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣 | |
I=34 嘉義市 R=25 台南縣 | |
第二碼 | |
身分證: 1 男姓 2 女生 | |
居留證: | |
臺灣地區無戶籍國民、大陸地區人民、港澳居民: | |
A 男性 B 女性 | |
外國人: | |
C 男性 D 女性 | |
第三碼 | |
身分證: 目前均為 0 | |
居留證: 1 男性 2 女性 | |
其餘 4~9 碼均為數字 0...9 | |
最末碼 檢核碼 | |
檢核碼為根據前九碼編碼加權後之計算產生,用以核對 (checksum) 字號正確性 | |
檢核碼意義可以參考 http://finalfrank.pixnet.net/blog/post/19639058-身分證字號驗證方法 | |
身分證字號產生器 https://people.debian.org/~paulliu/ROCid.html,可用以檢核程式是否正確 | |
居留證號碼也是利用類似的概念,祇是第二碼英文字依第一碼原則取對照數字,祇取個位數,也就是 | |
A 取 0, B 取 1, C 取 2, D 取 3 | |
以下是身分證檢核 JavaScript 程式函式 */ | |
function checkPid( pid ) { | |
if ( pid.length !== 10 ) return '身分證字號長度不正確'; | |
if ( !/(^[A-Za-z][12][\d]{8}$)|([A-Za-z][A-Da-d][\d]{8}$/.test(pid)) return '身分證字號含不合法字元,請檢查'; // PREG 驗證 | |
if ( !/^[A-Za-z][\d]{9}$/.test(pid)) { // 此為身分證字號 | |
pid = pid.toUpperCase(); // 即使輸入小寫字元,也將它轉成大寫字元 | |
var codes = '0123456789ABCDEFGHJKLMNPQRSTUVXYWZIO'; // 注意英文字母順序 | |
var pidCodes = {}; | |
$(codes.split('')).each( function( index, elem) { | |
pidCodes[elem] = index; // 建立字母vs數字對照表 | |
}); | |
// 依據前9碼權重總合與最後檢核碼比較 | |
var sum = 0; | |
for ( var i=8; i>0; i--) { | |
sum += parseInt(pidCodes[pid.charAt(i)]) * (9-i); | |
console.log( sum + '- ' + pid.charAt(i) + '= ' + parseInt(pidCodes[pid.charAt(i)]) * (9-i)); | |
} | |
var checkDigit = 10 - (sum + parseInt(pidCodes[pid.charAt(0)])%10*9 + parseInt(parseInt(pidCodes[pid.charAt(0)]/10)))%10; | |
return checkDigit === parseInt(pid.slice(-1)) ? '身分證字號檢核正確' : '身分證字號檢核不正確'; | |
} else { | |
if (/^[A-Za-z][A-Da-d][\d]{8}$/.test(pid)) { // 此為居留證證號 | |
// 程式內容待補充 | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
檢查碼是0的時候,會不正確,checkDigit算出來是10不等於0
要加上 checkDigit %= 10; //前9碼權重總合加起來是0的話,算出來是10,要再取個位數才行