统一社会信用代码的校验
根据中华人民共和国国家标准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
测试结果:
Edit by LukeLiu
原文作者:LukeLiu_
原文地址: https://blog.csdn.net/weixin_43930526/article/details/98393364
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/weixin_43930526/article/details/98393364
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章