统一社会信用代码的生成规则和校验逻辑见国标文件 GB 32100-2015
这里直接上代码
/**
* 登记管理部门+机构类别代码 固定组合
*/
private static final List<String> REGIST_CODE = Arrays.asList(
"11", "12", "13", "19",
"21", "29",
"31", "32", "33", "34", "35", "39",
"41", "49",
"51", "52", "53", "59",
"61", "62", "69",
"71", "72", "79",
"81", "89",
"91", "92", "93",
"A1", "A9",
"N1", "N2", "N3", "N9",
"Y1"
);
/**
* 信用代码基本字符
*/
private static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY0";
/**
* 加权因子
*/
private static final int[] WEIGHT = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
/**
* 是否统一社会信用代码
*
* @param xydm
* @return
*/
public static boolean isXydm(String xydm) {
// 校验之前简单正则筛选一下
String regex = "[0-9A-Z]{18}";
boolean matches = Pattern.matches(regex, xydm);
if (!matches) {
return false;
}
// 登记管理部门+机构类别代码验证
if (!REGIST_CODE.contains(xydm.substring(0, 2))) {
return false;
}
// 如果想更严谨一点,此处可增加行政区划代码和组织机构代码的验证
// 重点 开始校验码验证
int sum = 0;
char[] xydmChars = xydm.toCharArray();
for (int i = 0; i < 17; i++) {
sum = sum + BASE_CODE_STRING.indexOf(xydmChars[i]) * WEIGHT[i];
}
// 计算得出校验码的值,比对时需要换成字符
int jymNum = 31 - sum % 31;
char jymCode = BASE_CODE_STRING.charAt(jymNum);
return xydmChars[17] == jymCode;
}
public static void main(String[] args) {
System.out.println(isXydm("这里放信用代码"));
}