package com.xmkgsy.utils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
public class IDCardUtils {
public static Boolean verifyIdCard(String idCard) {
if (StringUtils.isEmpty(idCard)) {
return false;
}
idCard = idCard.replace("(","");
idCard = idCard.replace("(","");
idCard = idCard.replace(")","");
idCard = idCard.replace(")","");
String[] idCardArr = idCard.split("");
if (idCardArr.length == 18) {
return verifyIdCard(idCard, idCardArr);
} else if (idCardArr.length == 8) {
return verifyHKIdCard(idCardArr);
} else if (idCardArr.length == 10) {
return verifyTWIdCard(idCard, idCardArr);
}
return false;
}
private static Boolean verifyIdCard(String idCard, String[] idCardArr) {
String idCardSub = idCard.substring(0, 17);
if (!NumberUtils.isCreatable(idCardSub)) {
return false;
}
String[] idCardParam = "7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2".split("-");
String[] verifyNum = "1-0-X-9-8-7-6-5-4-3-2".split("-");
int result = 0;
for (int i = 0; i < 17; i++) {
result = result + Integer.parseInt(idCardArr[i]) * Integer.parseInt(idCardParam[i]);
}
int remainder = result % 11;
if (Objects.equals(idCardArr[17], verifyNum[remainder])) {
return true;
}
return false;
}
private static Boolean verifyHKIdCard(String[] idCardArr) {
String alphabet = "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";
List<String> alphabetList = Arrays.asList(alphabet.split("、"));
String[] verifyNum = "8765432".split("");
int index = alphabetList.indexOf(idCardArr[0]) + 1;
int result = index * Integer.parseInt(verifyNum[0]);
for (int i = 1; i < 7; i++) {
result = result + Integer.parseInt(idCardArr[i]) * Integer.parseInt(verifyNum[i]);
}
int remainder = result % 11;
if (remainder > 1) {
remainder = 11 - remainder;
}
if (Objects.equals(remainder, Integer.parseInt(idCardArr[7]))) {
return true;
}
return false;
}
private static Boolean verifyTWIdCard(String idCard, String[] idCardArr) {
String[] idCardParam = "ABCDEFGHJKLMNPQRSTUVXYWZIO".split("");
List<String> idCardParamList = Arrays.asList(idCardParam);
int num = idCardParamList.indexOf(idCardArr[0]) + 10;
idCard = idCard.replace(idCardArr[0], num + "");
idCardArr = idCard.split("");
int result = Integer.parseInt(idCardArr[0]);
for (int i = 1; i < 10; i++){
result = result + Integer.parseInt(idCardArr[i]) * (10-i);
}
int remainder = 10 - result % 10;
if (Objects.equals(remainder, Integer.parseInt(idCardArr[10]))) {
return true;
}
return false;
}
}