统一社会信用代码的校验问题

统一社会代码的生成规则是根据国家标准GB32100—2015《法人和其他组织统一社会信用代码编码规则》标准制定的。

先来一段代码:

    public static boolean validate18(String bizNo) {

        String regex = "^([0-9ABCDEFGHJKLMNPQRTUWXY]{2})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{10})$";
        if (!bizNo.matches(regex)) {
            return false;
        }

        String baseCode = "0123456789ABCDEFGHJKLMNPQRTUWXY";
        char[] baseCodeArray = baseCode.toCharArray();
        Map<Character, Integer> codes = new HashMap<Character, Integer>();
        for (int i = 0; i < baseCode.length(); i++) {
            codes.put(baseCodeArray[i], i);
        }

        char[] businessCodeArray = bizNo.toCharArray();
        Character check = businessCodeArray[17];
        if (baseCode.indexOf(check) == -1) {
            return false;
        }

        int[] ws = { 1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28 };
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            Character key = businessCodeArray[i];
            if (baseCode.indexOf(key) == -1) {
                return false;
            }
            sum += (codes.get(key) * ws[i]);
        }

        int c18 = 31 - sum % 31;
        if (c18 == 31) {
            c18 = 0;
        }
        return c18 == codes.get(check);

从代码上看应该满足国家标准,实际应用过程中发现存在很多不满足的情况,目前主要发现福建很多不满足,比如:91350211M0000XUF46,9131000063159284XQ等

请问各位有没有这类校验?

阅读 7.6k
2 个回答

91350100M0001TGQXM 也校验不通过

新手上路,请多包涵

91350628M0000K0H44也验证通不过,可发证的号码就是这个啊,看来不止我一个如此,有规范的验证方法,但手段却没跟上,导致出现自相矛盾的结果,简直汗颜啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题