判斷邏輯說明
410 |
782 |
19930905 |
305 |
6 |
省編碼 |
市編碼 |
出生年月日 |
隨機碼(最后一位是性別) |
校驗碼 |
/**
* 18位身份證號 最后一位校驗碼 判斷方法
* 邏輯:
* 1:身份證號前17位數分別乘不同的系數
* 從第1位到17位的系數分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
* 2:將乘積之和除以11,余數可能為:0 1 2 3 4 5 6 7 8 9 10
* 3:根據余數,分別對應最后一位身份證號:1 0 X 9 8 7 6 5 4 3 2
* 余數與校驗碼對應關系:0:1,1:0,2:X,3:9,4:8,5:7,6:6,7:5,8:4,9:3:10:2
*
* @param idCard 身份證號
*/
public static boolean checkIDCard(String idCard) {
if (idCard == null || idCard.equals("") || idCard.length() != 18) {
return false;
}
char[] chars = idCard.toCharArray();
int charsLength = chars.length - 1;
int count = 0;
for (int i = 0; i < charsLength; i++) {
int charI = Integer.parseInt(String.valueOf(chars[i]));
count += charI * (Math.pow(2, 17 - i) % 11);
}
String idCard18 = String.valueOf(chars[17]).toUpperCase();
String idCardLast;
switch (count % 11) {
case 0:
idCardLast = "1";
break;
case 1:
idCardLast = "0";
break;
case 2:
idCardLast = "X";
break;
default:
idCardLast = 12 - (count % 11) + "";
break;
}
return idCard18.equals(idCardLast);
}