判断逻辑说明
省编码 | 市编码 | 出生年月日 | 随机码(最后一位是性别) | 校验码 |
/**
* 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);
}