校验统一社会信用代码是否为真 Java
背景介绍
统一社会信用代码是由中华人民共和国国家市场监督管理总局颁发的一个唯一的标识码,用于标识法人身份,类似于其他国家的税号或企业注册号。由于社会信用代码的重要性,为了防止伪造和错误的使用,我们需要对输入的社会信用代码进行校验,以确保其是否为真实有效的代码。
本文将介绍如何使用 Java 编程语言来校验统一社会信用代码的有效性。
统一社会信用代码的结构
统一社会信用代码由18位数字或字母组成,按照特定的规则构成。其结构如下:
- 第1位:登记管理部门代码(数字或字母)
- 第2位:机构类别代码(数字或字母)
- 第3位到第8位:登记管理机关行政区划码(数字)
- 第9位到第17位:主体标识码(数字或字母)
- 第18位:校验码(数字或字母)
其中,校验码的计算公式如下:
- 将前17位数字和字母分别与对应的权重值相乘,权重值从左往右依次为:1 3 9 27 19 26 16 17 20 29 25 13 8 24 10 30 28
- 将权重值与对应位数的数字和字母的乘积相加得到总和
- 将总和除以31,取余数
- 根据余数对应的规则表找到对应的校验码
Java代码实现
下面是使用 Java 语言实现校验统一社会信用代码是否为真的示例代码:
public class UnifiedSocialCreditCodeValidator {
private static final String CHECK_CODES = "0123456789ABCDEFGHJKLMNPQRTUWXY";
public static boolean isValid(String code) {
if (code == null || code.length() != 18) {
return false;
}
int[] weights = {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++) {
char c = code.charAt(i);
int value = getValue(c);
sum += value * weights[i];
}
int remainder = sum % 31;
char checkCode = CHECK_CODES.charAt(remainder);
return code.charAt(17) == checkCode;
}
private static int getValue(char c) {
if (Character.isDigit(c)) {
return c - '0';
} else if (Character.isUpperCase(c)) {
return c - 'A' + 10;
} else {
return -1;
}
}
}
以上代码定义了一个 UnifiedSocialCreditCodeValidator
类,其中 isValid
方法用于校验统一社会信用代码。代码中使用了一个权重数组 weights
和一个校验码字符集合 CHECK_CODES
。
在 isValid
方法中,首先判断传入的代码长度是否为18位,如果不是则返回 false
。接下来,根据统一社会信用代码的校验规则,计算前17位的加权总和,并根据计算结果取余数。最后,根据余数找到对应的校验码,与输入代码的最后一位进行比较,如果相等,则表示校验通过。
状态图
下面是校验统一社会信用代码的状态图:
stateDiagram
[*] --> 校验
校验 --> 有效: 校验通过
校验 --> 无效: 校验不通过
有效 --> [*]
无效 --> [*]
使用示例
下面是使用示例代码来校验统一社会信用代码是否为真:
public class Main {
public static void main(String[] args) {
String code = "91350100M000100Y43";
boolean isValid = UnifiedSocialCreditCodeValidator.isValid(code);
if (isValid) {