Skip to content

Instantly share code, notes, and snippets.

@yyc1217
Last active July 24, 2023 08:31
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save yyc1217/3856443 to your computer and use it in GitHub Desktop.
Save yyc1217/3856443 to your computer and use it in GitHub Desktop.
身分證字號與居留證(統一證)編號檢核程式碼
/*******************************************************************************
* Copyright (c) 2012 Yeh-Yung Chang
* All rights reserved.
* http://experimentrecord.blogspot.tw
*******************************************************************************/
import java.util.Arrays;
public boolean isValidIDorRCNumber(String str) {
if (str == null || "".equals(str)) {
return false;
}
final char[] pidCharArray = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
// 原身分證英文字應轉換為10~33,這裡直接作個位數*9+10
final int[] pidIDInt = { 1, 10, 19, 28, 37, 46, 55, 64, 39, 73, 82, 2, 11, 20, 48, 29, 38, 47, 56, 65, 74, 83, 21, 3, 12, 30 };
// 原居留證第一碼英文字應轉換為10~33,十位數*1,個位數*9,這裡直接作[(十位數*1) mod 10] + [(個位數*9) mod 10]
final int[] pidResidentFirstInt = { 1, 10, 9, 8, 7, 6, 5, 4, 9, 3, 2, 2, 11, 10, 8, 9, 8, 7, 6, 5, 4, 3, 11, 3, 12, 10 };
// 原居留證第二碼英文字應轉換為10~33,並僅取個位數*8,這裡直接取[(個位數*8) mod 10]
final int[] pidResidentSecondInt = {0, 8, 6, 4, 2, 0, 8, 6, 2, 4, 2, 0, 8, 6, 0, 4, 2, 0, 8, 6, 4, 2, 6, 0, 8, 4};
str = str.toUpperCase();// 轉換大寫
final char[] strArr = str.toCharArray();// 字串轉成char陣列
int verifyNum = 0;
/* 檢查身分證字號 */
if (str.matches("[A-Z]{1}[1-2]{1}[0-9]{8}")) {
// 第一碼
verifyNum = verifyNum + pidIDInt[Arrays.binarySearch(pidCharArray, strArr[0])];
// 第二~九碼
for (int i = 1, j = 8; i < 9; i++, j--) {
verifyNum += Character.digit(strArr[i], 10) * j;
}
// 檢查碼
verifyNum = (10 - (verifyNum % 10)) % 10;
return verifyNum == Character.digit(strArr[9], 10);
}
/* 檢查統一證(居留證)編號 (2031/1/1停用) */
verifyNum = 0;
if (str.matches("[A-Z]{1}[A-D]{1}[0-9]{8}")) {
// 第一碼
verifyNum += pidResidentFirstInt[Arrays.binarySearch(pidCharArray, strArr[0])];
// 第二碼
verifyNum += pidResidentSecondInt[Arrays.binarySearch(pidCharArray, strArr[1])];
// 第三~八碼
for (int i = 2, j = 7; i < 9; i++, j--) {
verifyNum += Character.digit(strArr[i], 10) * j;
}
// 檢查碼
verifyNum = (10 - (verifyNum % 10)) % 10;
return verifyNum == Character.digit(strArr[9], 10);
}
/* 檢查統一證(居留證)編號 (2021/1/2實施) */
verifyNum = 0;
if (str.matches("[A-Z]{1}[89]{1}[0-9]{8}")) {
// 第一碼
verifyNum += pidResidentFirstInt[Arrays.binarySearch(pidCharArray, strArr[0])];
// 第二~八碼
for (int i = 1, j = 8; i < 9; i++, j--) {
verifyNum += Character.digit(strArr[i], 10) * j;
}
// 檢查碼
verifyNum = (10 - (verifyNum % 10)) % 10;
return verifyNum == Character.digit(strArr[9], 10);
}
return false;
}
@b284f-cc2
Copy link

b284f-cc2 commented Jun 12, 2019

Correct the line 21
原居留證第二碼英文字應轉換為10~33,並僅取個位數* 8,這裡直接取[(個位數* 8) mod 10]

@yyc1217
Copy link
Author

yyc1217 commented Jun 20, 2019

@b284f-cc2 已修改,謝謝指正!

@linhui1017
Copy link

感謝分享, 小弟轉成python正確使用中。

@rrushtw
Copy link

rrushtw commented Jan 10, 2022

感謝,恰巧遇到新住民身分證字號認證問題。
轉譯為C#,正常使用中。

@CyclopesTsai
Copy link

感謝分享

@ARueiz
Copy link

ARueiz commented Jul 24, 2023

感謝分享,轉成 php 可以正常使用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment