JAVA 校验组织机构代码工具类

/**
 * TODO
 * 组织机构代码校验工具类
 */
public class OrganizationCodeUtil {

    /*
    校验规则:
        只能填写数字和字母;
        由9位数字或字母组成,第9位是校验码,其计算规则如下:
        C[9] = 11 – ( ∑( C[i] * W[i] ) mod 11 )。
        其中,C[i]表示从左至右第i个位置上的数字或字母的ASC码;
        W[i]表示第i个位置上的加权因子,其值如下:
        i 1 2 3 4 5 6 7 8
        W[i] 3 7 9 10 5 8 4 2
         当C[9]=10时,校验码用X表示;
        当C[9]=11时,校验码用0表示;
        当C[9]介于0至9之间时,校验码即用C[9]表示。
        (3)不允许000000000该特殊代码。
     */
    public static boolean organizationCodeCheck(String code) {
        // 9位、不允许000000000该特殊代码
        if (code.length() != 9 || "000000000".equals(code)) {
            return false;
        }

        // 只能填写数字和字母
        for (int i = 0; i < code.length(); i++) {
            char c = code.charAt(i);
            // 字母
            if (Character.isLowerCase(c) || Character.isUpperCase(c)) {
                continue;
            }
            // 数字
            if (Character.isDigit(c)) {
                continue;
            }
            return false;
        }

        boolean flag = false;
        String[] wis = {"3", "7", "9", "10", "5", "8", "4", "2"};
        int weightedVal = 0;
        for (int i = 0; i < 8; i++) {
            int ci = getIntByChar(code.charAt(i));
            int wi = Integer.parseInt(wis[i]);
            weightedVal = weightedVal + ci * wi;
        }
        int checkCode = 11 - weightedVal % 11;
        String c9 = String.valueOf(code.charAt(8));
        if (checkCode == 10) {
            if ("X".equals(c9)) {
                flag = true;
            }
        }
        if (checkCode == 11) {
            if ("0".equals(c9)) {
                flag = true;
            }
        }
        if (checkCode > 0 && checkCode <= 9) {
            if (String.valueOf(checkCode).equals(c9)) {
                flag = true;
            }
        }

        return flag;
    }

    private static int getIntByChar(char val) {
        // 数字
        if (Character.isDigit(val)) {
            return Integer.parseInt(String.valueOf(val));
        }

        return Integer.valueOf(val);
    }

    public static void main(String[] args) {
        // 761569584\L40160087\319852897\66695787X\753585920\081788820
        String code = "081788820";
        System.out.println(organizationCodeCheck(code));
    }
}

  

posted @ 2020-12-23 15:08  ヤBig、Bossづ  阅读(585)  评论(0编辑  收藏  举报