1 import java.util.regex.*;
2 /**
3 * 中国大陆的身份证检验算法,以及15位和18位身份证的相互转换。
4 * @author hutz
5 *
6 */
7 public class IdCardUtil {
8
9 public IdCardUtil(){
10
11 }
12
13 /**
14 * 15位身份证号码转化为18位的身份证。如果是18位的身份证则直接返回,不作任何变化。
15 * @param idCard,15位的有效身份证号码
16 * @return idCard18 返回18位的有效身份证
17 */
18 public String IdCard15to18(String idCard){
19 idCard = idCard.trim();
20 StringBuffer idCard18 = new StringBuffer(idCard);
21 //加权因子
22 //int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
23 //校验码值
24 char[] checkBit = {'1','0','X','9','8','7','6','5','4','3','2'};
25 int sum = 0;
26 //15位的身份证
27 if(idCard != null && idCard.length()==15){
28 idCard18.insert(6, "19");
29 for(int index=0;index<idCard18.length();index++){
30 char c = idCard18.charAt(index);
31 int ai = Integer.parseInt(new Character(c).toString());
32 //sum = sum+ai*weight[index];
33 //加权因子的算法
34 int Wi = ((int)Math.pow(2, idCard18.length()-index))%11;
35 sum = sum+ai*Wi;
36 }
37 int indexOfCheckBit = sum%11; //取模
38 idCard18.append(checkBit[indexOfCheckBit]);
39 }
40
41 return idCard18.toString();
42 }
43
44 /**
45 * 转化18位身份证位15位身份证。如果输入的是15位的身份证则不做任何转化,直接返回。
46 * @param idCard 18位身份证号码
47 * @return idCard15
48 */
49 public String IdCard18to15(String idCard){
50 idCard = idCard.trim();
51 StringBuffer idCard15 = new StringBuffer(idCard);
52 if(idCard!=null && idCard.length()==18){
53 idCard15.delete(17, 18);
54 idCard15.delete(6, 8);
55 }
56 return idCard15.toString();
57
58 }
59
60
61 /**
62 * 校验是否是一个有效的身份证。如果是18的身份证,则校验18位的身份证。15位的身份证不校验,也无法校验
63 * @param idCart
64 * @return
65 */
66 public boolean checkIDCard(String idCard){
67 boolean isIDCard = false;
68 Pattern pattern = Pattern.compile("\\d{15}|\\d{17}[x,X,0-9]");
69 Matcher matcher = pattern.matcher(idCard);
70 if(matcher.matches()){//可能是一个身份证
71 isIDCard = true;
72 if(idCard.length()==18){//如果是18的身份证,则校验18位的身份证。15位的身份证暂不校验
73 String IdCard15 = IdCard18to15(idCard);
74 String IdCard18 = IdCard15to18(IdCard15);
75 if(!idCard.equals(IdCard18)){
76 isIDCard = false;
77 }
78 }else if(idCard.length()==15){
79 isIDCard = true;
80 }else{
81 isIDCard = false;
82 }
83 }
84
85 return isIDCard;
86 }
87
88 }