统一社会信用代码的校验

根据中华人民共和国国家标准GB32100-2015:法人和其他组织统一社会信用代码编码规则。

统一社会信用代码的构成

社会组织统一社会信用代码是为每个社会组织发放一个唯一的、终身不变的主题标识代码,并以其为载体采集、查询、共享、比对各类主体信用信息,设计为18位。如图:

统一代码的具体赋码规则如下:
第一部分(第1位):登记管理部门代码。暂按国务院序列规则,5表示民政部门。
第二部分(第2位):机构类别代码。“1”表示社会团体、“2”表示民办非企业单位、“3”表示基金会、“9”表示其他。
第三部分(第3-8位):登记管理机关行政区划码,参照GB/T 2260中华人民共和国行政区划代码标准。(登记机关所在地的行政区划)。
第四部分(第9-17位):主体标识码(组织机构代码),其中第17位为主体标识码(组织机构代码)的校验码。第17位校验码算法规则按照《全国组织机构代码编制规则》(国标GB11714—1997)计算。
第五部分(第18位):统一社会信用代码的校验码。第18位校验码算法规则按照《GB -2015 法人及其他组织统一社会信用代码编制规则》计算。
在这里插入图片描述
代码字符集对应顺序为:字符0-9对应数字0-9,字母A-Z中去掉I、O、S、V、Z后剩下的20个依次对应数字10-30

JAVA语言实现

package 帮憨憨爹干活;

public class mainAlgorithm {
	public static void main(String[] args) {
		String test[]= {"51420000MJH2003604","51420000MJH200408C","52420000MJH233410E",
						"51420000MJH200395N","51420000MJH2003791","53420000MJH2448303",
						"52420000MJH233402K","52420000MJH2333813","52420000MJH23339XT",
						"51420000MJH200387U"};
		for(int i=0;i<10;i++)
		{
			if(checkUSCC(test[i]))
				System.out.println("验证通过");
			else
				System.out.println("验证失败");
		}
		
	}
	/*
	[函数名]checkUSCC
	[功能]校验18位统一社会信用代码正确性
	[参数]testUSCC:待校验的统一社会信用代码(要求字母已经保持大写)
	[返回值]boolean类型,0(false)表示验证未通过,1(true)表示验证通过
	*/
	public static boolean checkUSCC(String testUSCC)
	{
		if(testUSCC.length()!=18)
		{
			System.out.println("统一社会信用代码长度错误");
			return false;
		}
		
		int Weight[]= {1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28};		//用于存放权值
		int index=0;														//用于计算当前判断的统一社会信用代码位数
		char testc;															//用于存放当前位的统一社会信用代码
		int tempSum=0;														//用于存放代码字符和加权因子乘积之和
		int tempNum=0;
		for(index=0;index<=16;index++)
		{
			testc=testUSCC.charAt(index);
			
			if(index==0)
			{
				if(testc!='1'&&testc!='5'&&testc!='9'&&testc!='Y')
				{
					System.out.println("统一社会信用代码中登记管理部门代码错误");
					return false;
				}
			}
			
			if(index==1)
			{
				if(testc!='1'&&testc!='2'&&testc!='3'&&testc!='9')
				{
					System.out.println("统一社会信用代码中机构类别代码错误");
					return false;
				}
			}
			
			tempNum=charToNum(testc);
			if(tempNum!=-1)								//验证代码中是否有错误字符
			{
				tempSum+=Weight[index]*tempNum;			
			}
			else 
			{
				System.out.println("统一社会信用代码中出现错误字符");
				return false;
			}
		}
		tempNum=31-tempSum%31;
		if(tempNum==31)  tempNum=0;
		if(charToNum(testUSCC.charAt(17))==tempNum)			//按照GB/T 17710标准对统一社会信用代码前17位计算校验码,并与第18位校验位进行比对
			return true;
		else 
			return false;
	}
	/*
	[函数名]charToNum
	[功能]按照GB32100-2015标准代码字符集将用于检验的字符变为相应数字
	[参数]c:待转换的字符
	[返回值]转换完成后对应的数字,若无法找到字符集中字符,返回-1
	*/
	public static int charToNum(char c)
	{
		switch (c)
		{
			case '0':
				return 0;
			case '1':
				return 1;
			case '2':
				return 2;
			case '3':
				return 3;
			case '4':
				return 4;
			case '5':
				return 5;
			case '6':
				return 6;
			case '7':
				return 7;
			case '8':
				return 8;
			case '9':
				return 9;
			case 'A':
				return 10;
			case 'B':
				return 11;
			case 'C':
				return 12;
			case 'D':
				return 13;
			case 'E':
				return 14;
			case 'F':
				return 15;
			case 'G':
				return 16;
			case 'H':
				return 17;
			case 'J':
				return 18;
			case 'K':
				return 19;
			case 'L':
				return 20;
			case 'M':
				return 21;
			case 'N':
				return 22;
			case 'P':
				return 23;
			case 'Q':
				return 24;
			case 'R':
				return 25;
			case 'T':
				return 26;
			case 'U':
				return 27;
			case 'W':
				return 28;
			case 'X':
				return 29;
			case 'Y':
				return 30;
		default:
				return -1;
		}		
	}

}

测试所用的统一社会信用代码来自湖北省民政厅官网的公开信息:
http://zwfw.hubei.gov.cn:8503/xcms/shzzwebsite/jumpPage/shzz_xzxkgg.jhtml?currentPage=1&djType=1&flagname=XKGG
测试结果:
统一社会信用代码的校验_第1张图片
Edit by LukeLiu

你可能感兴趣的:(JAVA,统一社会信用代码,校验)