package cyachina.util;

/**
 * Created by IntelliJ IDEA.
 * User: Administrator
 * Date: 2004-8-13
 * Time: 15:37:28
 * To change this template use File | Settings | File Templates.
 */
public class IDCardUtil {

    /**
     *
     * @param century  19xx 年用 19,20xx 年用 20
     * @param idCardNo15 待转换的 15 位身份证号码
     * @return
     */
    public static String from15to18(int century, String idCardNo15) {

        String centuryStr = "" + century;
        if(century <0 || centuryStr.length() != 2)
            throw new IllegalArgumentException("世纪数无效!应该是两位的正整数。");
        if(!(isIdCardNo(idCardNo15) && idCardNo15.length() == 15))
            throw new IllegalArgumentException("旧的身份证号格式不正确!");

        int[] weight = new int[] {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};

        // 通过加入世纪码, 变成 17 为的新号码本体.
        String newNoBody = idCardNo15.substring(0, 6) + centuryStr + idCardNo15.substring(6);

        //下面算最后一位校验码

        int checkSum = 0;
        for(int i=0; i< 17; i++) {
            int ai = Integer.parseInt("" + newNoBody.charAt(i)); // 位于 i 位置的数值
            checkSum = checkSum + ai * weight[i];
        }

        int checkNum = checkSum % 11;
        String checkChar = null;

        switch(checkNum) {
            case 0: checkChar = "1"; break;
            case 1: checkChar = "0"; break;
            case 2: checkChar = "X"; break;
            default: checkChar = "" + (12 - checkNum);
        }

        return newNoBody + checkChar;

    }


    public static String from18to15(String idCardNo18) {

        if(!(isIdCardNo(idCardNo18) && idCardNo18.length() == 18))
            throw new IllegalArgumentException("身份证号参数格式不正确!");

        return idCardNo18.substring(0, 6) + idCardNo18.substring(8, 17);
    }

    /**
     * 判断给定的字符串是不是符合身份证号的要求
     * @param str
     * @return
     */
    public static boolean isIdCardNo(String str) {

        if(str == null)
            return false;

        int len = str.length();
        if(len != 15 && len != 18)
            return false;

        for(int i=0; i<len; i++) {
            try {
                Integer.parseInt("" + str.charAt(i));
            }
            catch(NumberFormatException e) {
                return false;
            }
        }

        return true;
    }


    public static void main(String[] args) {

        System.out.println(from15to18(19, "XXXXXXXXXXXXXXX"));
        System.out.println(from18to15("XXXXXXXXXXXXXXXXXX"));
    }

}

posted on 2005-10-10 10:23  刘民  阅读(7061)  评论(8编辑  收藏  举报