注册号 GS15-2006
6 位首次登记机关代码 + 8 位顺序码 + 1 位校验码
- 首次登记机关代码:国家工商总局用 “100000” 表示,其他使用 6 位行政区划代码表示
- 顺序码:第一位采用如下规则:
- 内资各类企业 0,1,2,3
- 外资企业 4,5
- 个体工商户 6,7,8,9
- 计算校验码
java
版本
public class RegNumUtil {
public static int getParityCode(String code) {
int checkCode;
int rem = 0;
char[] chars = code.toCharArray();
for (char c : chars) {
rem = (rem + Integer.parseInt(c + "")) % 10;
if (rem == 0) {
rem = 10;
}
rem = (rem * 2) % 11;
}
checkCode = (11 - rem) % 10;
return checkCode;
}
public static String getFullRegNum(String regNum) {
return regNum + getParityCode(regNum);
}
}
首次登记机关代码版本:2001 年中华人民共和国行政区划代码(GB/T 2260-2002 被替代 GB/T 2260-2007)
社会统一信用代码编码规则 GB 32100-2015
登记管理部门代码 1 位 + 机构类别代码 1 位 + 登记管理机关行政区划码 6 位(GB/T 2260-2007, 2020年中华人民共和国行政区划代码)+ 主体标识码(组织机构代码)9 位(GB 11714-1997) + 校验码 1 位
- 登记管理部门代码
登记管理部门 | 代码标识 |
---|---|
机构编制 | 1 |
外交 | 2 |
司法行政 | 3 |
文化 | 4 |
民政 | 5 |
旅游 | 6 |
宗教 | 7 |
工会 | 8 |
工商 | 9 |
中央军委改革和编制办公室 | A |
农业 | N |
其他 | Y |
- 机构类别代码
登记管理部门 | 机构类别 | 代码标识 |
---|---|---|
机构编制 | 机关 | 1 |
事业单位 | 2 | |
编办直接管理机构编制的群众团体 | 3 | |
其他 | 9 | |
外交 | 外国常驻新闻机构 | 1 |
其他 | 9 | |
司法行政 | 律师执业机构 | 1 |
公证处 | 2 | |
基层法律服务所 | 3 | |
司法鉴定机构 | 4 | |
仲裁委员会 | 5 | |
其他 | 9 | |
文化 | 外国在华文化中心 | 1 |
其他 | 9 | |
民政 | 社会团体 | 1 |
民办非企业单位 | 2 | |
基金会 | 3 | |
其他 | 9 | |
旅游 | 外国旅游部门常驻代表机构 | 1 |
港澳台地区旅游部门常驻内地(大陆)代表机构 | 2 | |
其他 | 9 | |
宗教 | 宗教活动场所 | 1 |
宗教院校 | 2 | |
其他 | 9 | |
工会 | 基层工会 | 1 |
其他 | 9 | |
工商 | 企业 | 1 |
个体工商户 | 2 | |
农民专业合作社 | 3 | |
中央军委改革和编制办公室 | 军队事业单位 | 1 |
其他 | 9 | |
农业 | 组级集体经济组织 | 1 |
村级集体经济组织 | 2 | |
乡镇级集体经济组织 | 3 | |
其他 | 9 | |
其他 | 1 |
- 校验码
- 组织机构代码校验码
public class OrganizationCodeUtil {
private static final int[] WEIGHT = {3, 7, 9, 10, 5, 8, 4, 2};
private static final char[] BASE_CODE_ARRAY = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
private static final Map<Character, Integer> CODE_INDEX_MAP;
static {
CODE_INDEX_MAP = new HashMap<>();
for (int i = 0; i < BASE_CODE_ARRAY.length; i++) {
CODE_INDEX_MAP.put(BASE_CODE_ARRAY[i], i);
}
}
/**
* 计算全国组织机构代码校验码 GB 11714-1997
*
* @param organizationCode 组织机构代码
* @return 校验符
*/
public static char getParityCode(CharSequence organizationCode) {
int sum = 0;
int codeIndex;
for (int i = 0; i < 8; i++) {
codeIndex = CODE_INDEX_MAP.get(organizationCode.charAt(i));
sum += codeIndex * WEIGHT[i];
}
int result = 11 - sum % 11;
switch (result) {
case 10:
return 'X';
case 11:
return '0';
default:
return BASE_CODE_ARRAY[result];
}
}
}
- 统一社会信用代码校验码
public class CreditCodeUtil {
private static final int[] WEIGHT = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
private static final char[] BASE_CODE_ARRAY = "0123456789ABCDEFGHJKLMNPQRTUWXY".toCharArray();
private static final Map<Character, Integer> CODE_INDEX_MAP;
static {
CODE_INDEX_MAP = new HashMap<>();
for (int i = 0; i < BASE_CODE_ARRAY.length; i++) {
CODE_INDEX_MAP.put(BASE_CODE_ARRAY[i], i);
}
}
/**
* 获取校验码 GB 32100-2015
*
* @param creditCode 统一社会信息代码
* @return 获取较验位的值
*/
public static char getParityBit(CharSequence creditCode) {
int sum = 0;
Integer codeIndex;
for (int i = 0; i < 17; i++) {
codeIndex = CODE_INDEX_MAP.get(creditCode.charAt(i));
sum += codeIndex * WEIGHT[i];
}
int result = 31 - sum % 31;
switch (result) {
case 30:
return 'Y';
case 31:
return '0';
default:
return BASE_CODE_ARRAY[result];
}
}
/**
* 根据统一信用代码前 16 位获得 2 位校验码
*
* @param creditCode 统一信用代码前 16 位
* @return 完整统一信用代码
*/
public static String getFullCreditCode(String creditCode) {
String organizationCode = creditCode.substring(8, 16);
char firstCode = OrganizationCodeUtil.getParityCode(organizationCode);
creditCode = creditCode + firstCode;
char secondCode = getParityBit(creditCode);
return creditCode + secondCode;
}
}