默而識之,學而不厭,誨人不倦。
如果文中有錯誤之處,望指正!
以下內(nèi)容參考鏈接:
https://www.cnblogs.com/lishupeng/p/6306446.html
https://www.cnblogs.com/czq520/p/11764601.html
/**
* 權(quán)重位
*/
private static int[] w = {7, 9, 10, 5, 8, 4, 2, 1, 6,
3, 7, 9, 10, 5, 8, 4, 2};
/**
* 校驗碼字符數(shù)組
*/
private static char[] verifyCode = {'1','0','X','9','8','7','6','5','4','3','2'};
/**
* 判斷是否為合法身份證號
* @param idCard
* @return
*/
public static boolean isCard(String idCard) {
// 1. 如果為空或位數(shù)不對則
if(StringUtils.isBlank(idCard) || ( idCard.length() != 15 && idCard.length() != 18)){
return false;
}
// 2. 如果是15位身份證號轉(zhuǎn)成18位
if( idCard.length() == 15){
try {
idCard = getEighteenIdCard(idCard);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// 3. 校驗身份證號
char[] c = idCard.toCharArray();
int sum = 0;
for (int i = 0; i < w.length; i++) {
sum += (c[i] - '0') * w[i];
}
char[] verifyCode = "10X98765432".toCharArray();
char ch = verifyCode[sum % 11];
return c[17] == ch;
}
/**
* 15位身份證 轉(zhuǎn)18位
* @param fifteenIdCard
* @return
* @throws Exception
*/
public static String getEighteenIdCard(String fifteenIdCard) throws Exception {
// 1. 判斷是否為15位身份證號
if (fifteenIdCard != null && fifteenIdCard.length() == 15) {
// 2. 拼接成18位身份證號
StringBuilder eighteenIdCard = new StringBuilder();
eighteenIdCard
.append(fifteenIdCard.substring(0,6))
.append("19")
.append(fifteenIdCard.substring(6))
.append(getVerifyCode(eighteenIdCard.toString()));
return eighteenIdCard.toString();
} else {
throw new Exception("不是15位的身份證");
}
}
/**
* 獲取身份證的校驗碼
* lsp 2017年1月19日13:47:52
* @param idCardNumber
* @return
* @throws Exception
*/
public static char getVerifyCode(String idCardNumber) throws Exception {
// 1. 非空和小于17位判斷
if (StringUtils.isBlank(idCardNumber) || idCardNumber.length() == 15) {
throw new Exception("不合法的身份證號碼");
}
// 2. 生成校驗碼
char[] Ai = idCardNumber.toCharArray();
int S = 0;
int Y;
for (int i = 0; i < w.length; i++) {
S += (Ai[i] - '0') * w[i];
}
Y = S % 11;
return verifyCode[Y];
}
/**
* 測試
* @param args
*/
public static void main(String[] args) {
System.out.println(isCard("220182190001018888"));
}