判断逻辑说明

省编码市编码出生年月日随机码(最后一位是性别)校验码
    /**
     * 18位身份证号 最后一位校验码 判断方法
     * 逻辑:
     * 1:身份证号前17位数分别乘不同的系数
     * 从第1位到17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
     * 2:将乘积之和除以11,余数可能为:0 1 2 3 4 5 6 7 8 9 10
     * 3:根据余数,分别对应最后一位身份证号:1 0 X 9 8 7 6 5 4 3 2
     * 余数与校验码对应关系:0:1,1:0,2:X,3:9,4:8,5:7,6:6,7:5,8:4,9:3:10:2
     *
     * @param idCard 身份证号
     */
    public static boolean checkIDCard(String idCard) {
        if (idCard == null || idCard.equals("") || idCard.length() != 18) {
            return false;
        }

        char[] chars = idCard.toCharArray();
        int charsLength = chars.length - 1;
        int count = 0;
        for (int i = 0; i < charsLength; i++) {
            int charI = Integer.parseInt(String.valueOf(chars[i]));
            count += charI * (Math.pow(2, 17 - i) % 11);
        }
        String idCard18 = String.valueOf(chars[17]).toUpperCase();

        String idCardLast;
        switch (count % 11) {
            case 0:
                idCardLast = "1";
                break;

            case 1:
                idCardLast = "0";
                break;

            case 2:
                idCardLast = "X";
                break;

            default:
                idCardLast = 12 - (count % 11) + "";
                break;
        }
        return idCard18.equals(idCardLast);
    }
01-03 02:58