身份证号转换15 18
package com.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 中国大陆的身份证检验算法,以及15位和18位身份证的相互转换。
*
*/
public class IdCardUtil {
public IdCardUtil(){
}
/**
* 15位身份证号码转化为18位的身份证。如果是18位的身份证则直接返回,不作任何变化。
* @param idCard,15位的有效身份证号码
* @return idCard18 返回18位的有效身份证
*/
public String IdCard15to18(String idCard){
idCard = idCard.trim();
StringBuffer idCard18 = new StringBuffer(idCard);
//加权因子
//int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//校验码值
char[] checkBit = {'1','0','X','9','8','7','6','5','4','3','2'};
int sum = 0;
//15位的身份证
if(idCard != null && idCard.length()==15){
idCard18.insert(6, "19");
for(int index=0;index<idCard18.length();index++){
char c = idCard18.charAt(index);
int ai = Integer.parseInt(new Character(c).toString());
//sum = sum+ai*weight[index];
//加权因子的算法
int Wi = ((int)Math.pow(2, idCard18.length()-index))%11;
sum = sum+ai*Wi;
}
int indexOfCheckBit = sum%11; //取模
idCard18.append(checkBit[indexOfCheckBit]);
}
return idCard18.toString();
}
/**
* 转化18位身份证位15位身份证。如果输入的是15位的身份证则不做任何转化,直接返回。
* @param idCard 18位身份证号码
* @return idCard15
*/
public String IdCard18to15(String idCard){
idCard = idCard.trim();
StringBuffer idCard15 = new StringBuffer(idCard);
if(idCard!=null && idCard.length()==18){
idCard15.delete(17, 18);
idCard15.delete(6,;
}
return idCard15.toString();
}
/**
* 校验是否是一个有效的身份证。如果是18的身份证,则校验18位的身份证。15位的身份证不校验,也无法校验
* @param idCart
* @return
*/
public boolean checkIDCard(String idCard){
boolean isIDCard = false;
Pattern pattern = Pattern.compile("\\d{15}|\\d{17}[x,X,0-9]");
Matcher matcher = pattern.matcher(idCard);
if(matcher.matches()){//可能是一个身份证
isIDCard = true;
if(idCard.length()==18){//如果是18的身份证,则校验18位的身份证。15位的身份证暂不校验
String IdCard15 = IdCard18to15(idCard);
String IdCard18 = IdCard15to18(IdCard15);
if(!idCard.equals(IdCard18)){
isIDCard = false;
}
}else if(idCard.length()==15){
isIDCard = true;
}else{
isIDCard = false;
}
}
return isIDCard;
}
public static void main(String args[]){
IdCardUtil u = new IdCardUtil();
String idCard = "220211198903230016";//18
String idCard15 = "220211890323001";//15
idCard = u.IdCard18to15(idCard);
System.out.println("---------->>>"+idCard);
}
}