首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

身份证号变换15 18

2012-10-25 
身份证号转换15 18package com.utilimport java.util.regex.Matcherimport java.util.regex.Pattern/**

身份证号转换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);
    }
   
}

热点排行