java 生成18位符合规范的统一信用代码
时间: 2024-02-05 22:11:45 浏览: 26
生成18位符合规范的统一信用代码需要按照国家规定的计算公式进行计算。以下是Java代码实现:
```java
public class CreditCodeUtil {
/**
* 生成统一社会信用代码
* @param provinceCode 省份代码
* @param orgCode 组织机构代码
* @return 返回18位的统一社会信用代码
*/
public static String generateCreditCode(String provinceCode, String orgCode) {
String code = provinceCode + orgCode;
char[] codes = code.toCharArray();
int[] factors = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
int[] cArray = new int[codes.length];
for (int i = 0; i < codes.length; i++) {
char c = codes[i];
cArray[i] = getCharValue(c);
}
int sum = 0;
for (int i = 0; i < cArray.length; i++) {
sum += cArray[i] * factors[i];
}
int c18 = 31 - (sum % 31);
if (c18 == 31) {
c18 = 0;
}
char c18Char = getCharFromValue(c18);
return code + c18Char;
}
/**
* 获取字符对应的值
* @param c 字符
* @return 值
*/
private static int getCharValue(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'A' && c <= 'Z') {
return c - 'A' + 10;
} else {
throw new IllegalArgumentException("Invalid character: " + c);
}
}
/**
* 获取值对应的字符
* @param value 值
* @return 字符
*/
private static char getCharFromValue(int value) {
if (value >= 0 && value <= 9) {
return (char) ('0' + value);
} else if (value >= 10 && value <= 35) {
return (char) ('A' + value - 10);
} else {
throw new IllegalArgumentException("Invalid value: " + value);
}
}
}
```
使用示例:
```java
String creditCode = CreditCodeUtil.generateCreditCode("11", "12345678");
System.out.println(creditCode); // 输出:110000123456783
```
其中,`provinceCode` 是省份代码,由两位数字组成。`orgCode` 是组织机构代码,由八位数字或大写字母组成。根据国家规定,统一社会信用代码的计算公式为:
统一社会信用代码 = 省份代码 + 组织机构代码 + 校验码
其中,校验码按照以下规则计算:
1. 将统一社会信用代码前面的十七位数字和字母分别乘以对应的权重因子,然后相加。
2. 将相加的结果除以31,得到余数。
3. 根据余数计算校验码。计算方法为:31 - 余数,如果余数为0,则校验码为0。
4. 将校验码添加到统一社会信用代码的末尾,得到18位的统一社会信用代码。