身份证号15 18位转换

 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 }

 

posted on 2013-06-14 11:10  lylyalong  阅读(1059)  评论(0编辑  收藏  举报

导航