身份证15位与18位互转
最近在做一项目,用户可能用的是18位身份证号查询信息,但是登记的时候用的是15位身份证号登记的 ,想了好久最终,想到在后台获取到身份证号,通过工具类转化,18位转15位,这样取到两种身份证号,传到数据库用 OR 条件拼接就好了
package com.until;
/**
* 15位及18位身份证互转类
* @author
* @date 2020/07/20
*
*/
public class IDCardUtil {
private IDCardUtil(){
//todo
}
/**
* 15位身份证转18位
* @param idCard
* @return
*/
//15位转18位的,需要一个15位的身份证号参数
public static String getIdCardfrom15to18(String idCard15){
StringBuffer idCard18 = new StringBuffer(idCard15);
// 校验码值
char[] checkBit = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3',
'2' };
int sum = 0;
if(idCard15.length() != 15){
throw new RuntimeException("the length of idcard is not 15");
}
idCard18.insert(6, "19");
for(int i = 0; i < idCard18.length(); i++){
char c = idCard18.charAt(i);
int num = c - '0';
//获取当前权重
int weight = (int)(Math.pow(2, idCard18.length() - i)) % 11;
sum += num * weight;
}
//sum求模
int index = sum % 11;
//append校验码
idCard18.append(checkBit[index]);
return idCard18.toString() ;
}
//18位转15位的,需要一个18位的身份证号参数
public static String getIdCardfrom18to15(String idCard18){
StringBuffer idCard15 = new StringBuffer(idCard18);
if(idCard15.length() != 18){
throw new RuntimeException("the length of idcard is not 18");
}
idCard15.delete(17, 18);
idCard15.delete(6, 8);
return idCard15.toString();
}
}