网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接。这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧)。

如果在使用过程中有疑虑,请参考:较验规则

package com.mengyunzhi.common.utils; import org.apache.commons.collections4.BidiMap; import org.apache.commons.collections4.bidimap.TreeBidiMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.validation.ValidationException; import java.util.Map; import java.util.Random; /** * 统一社会停用用代码 */ public interface UnifiedCreditCodeUtils { Logger logger = LoggerFactory.getLogger(UnifiedCreditCodeUtils.class); String baseCode = "0123456789ABCDEFGHJKLMNPQRTUWXY"; char[] baseCodeArray = baseCode.toCharArray(); int[] wi = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28}; /** * 生成供较验使用的 Code Map * * @return BidiMap */ static BidiMap generateCodes() { BidiMap codes = new TreeBidiMap<>(); for (int i = 0; i < baseCode.length(); i++) { codes.put(baseCodeArray[i], i); } return codes; } /** * 较验社会统一信用代码 * * @param unifiedCreditCode 统一社会信息代码 * @return 符合: true */ static boolean validateUnifiedCreditCode(String unifiedCreditCode) { if ((unifiedCreditCode.equals("")) || unifiedCreditCode.length() != 18) { return false; } Map codes = generateCodes(); int parityBit; try { parityBit = getParityBit(unifiedCreditCode, codes); } catch (ValidationException e) { return false; } return parityBit == codes.get(unifiedCreditCode.charAt(unifiedCreditCode.length() - 1)); } /** * 获取较验码 * * @param unifiedCreditCode 统一社会信息代码 * @param codes 带有映射关系的国家代码 * @return 获取较验位的值 */ static int getParityBit(String unifiedCreditCode, Map codes) { char[] businessCodeArray = unifiedCreditCode.toCharArray(); int sum = 0; for (int i = 0; i < 17; i++) { char key = businessCodeArray[i]; if (baseCode.indexOf(key) == -1) { throw new ValidationException("第" + String.valueOf(i + 1) + "位传入了非法的字符" + key); } sum += (codes.get(key) * wi[i]); } int result = 31 - sum % 31; return result == 31 ? 0 : result; } /** * 获取一个随机的统一社会信用代码 * * @return 统一社会信用代码 */ static String generateOneUnifiedCreditCode() { Random random = new Random(); StringBuilder buf = new StringBuilder(); for (int i = 0; i < 17; ++i) { int num = random.nextInt(baseCode.length() - 1); buf.append(baseCode.charAt(num)); } String code = buf.toString(); String upperCode = code.toUpperCase(); BidiMap codes = generateCodes(); int parityBit = getParityBit(upperCode, codes); if (codes.getKey(parityBit) == null) { logger.debug("生成社会统一信用代码不符合规则"); upperCode = generateOneUnifiedCreditCode(); } else { upperCode = upperCode + codes.getKey(parityBit); } return upperCode; } }

测试

package com.mengyunzhi.common.utils; import org.assertj.core.api.Assertions; import org.junit.Test; import static org.junit.Assert.*; public class UnifiedCreditCodeUtilsTest { @Test public void validateUnifiedCreditCode() { String code = "911310827965850580"; Assertions.assertThat(UnifiedCreditCodeUtils.validateUnifiedCreditCode(code)).isTrue(); } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。

java 组织机构代码_JAVA实现社会统一信用代码校验的方法|chu相关推荐

  1. java 组织机构代码_JAVA实现社会统一信用代码较验

    网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接.这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧). 如果在使用过程中有疑虑,请参考:较验规则 代码实现 package ...

  2. java 组织机构代码_JAVA实现社会统一信用代码校验的方法

    网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接.这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧). 如果在使用过程中有疑虑,请参考:较验规则 package com. ...

  3. java 社会统一信用代码分解,获取登记管理部门代码、机构类别代码、登记管理机关行政区划码、 主体标识码、校验码

    问题描述: `提示:根据已有的社会统一信用编码,获取每个组成部分的内容 学习内容: 提示:这里需要说明一下,统一社会信用代码的构成 社会统一信用代码是由18位 阿拉伯数字或大写英文字母(不使用I.O. ...

  4. Python 生成、识别社会统一信用代码

    三证合一之后,社会统一信用代码就是企业的身份证.也就是说只要你的程序涉及企业信息的录入,那就少不了社会统一信用代码的录入.这里分享一个工具,可以用 Python 来识别社会统一信用代码,也可以随机生成 ...

  5. Js中身份证验证及社会统一信用代码验证

    二代身份证验证规则如下: //函数参数必须是字符串,因为二代身份证号码是十八位,而在javascript中,十八位的数值会超出计算范围,造成不精确的结果,导致最后两位和计算的值不一致,从而该函数出现错 ...

  6. oracle校验社会统一信用代码(菜J笔记)

    今天下午花了一下午时间,查了很久百度,写了一个很菜的东西 如果有什么问题,欢迎各位大佬指出,直接上代码 统一社会信用代码编码规则-维基百科 身份证号码的编码规则及校验-简书 国家企业信用信息公示查询系 ...

  7. 手机号,身份证号,邮政编码,统一信用代码,发票抬头,纳税人识别号正则校验

    手机号 phone(rule, value, callback) {const reg = /^[1][3,4,5,6.7,8,9][0-9]{9}$/if (!reg.test(value)) {c ...

  8. PHP验证统一信用代码

    <?php /*** 判断是否为统一社会信用代码*/ function isCompanyCode($str){$one = '159Y';//第一位可以出现的字符$two = '12391'; ...

  9. java range(10)_Java 中的十个 ” 单行代码编程 ” ( OneLiner )

    原标题:Java 中的十个 " 单行代码编程 " ( OneLiner ) 作者:飒然Hang 原文链接:www.rowkey.me/blog/2017/09/09/java-on ...

最新文章

  1. 初学Python常见异常错误,总有一处你会遇到!
  2. Struts2中Action之ResultType
  3. 【Flask项目】sqlalchemy原生sql查询,返回字典形式数据
  4. spark 1.4 编译
  5. postman 使用_Postman简单使用
  6. SDUT-保留整数 -
  7. ThinkPHP入门篇(一)
  8. Shell脚本笔记(二)Shell变量
  9. 3D VR卡镜的使用方法
  10. 为VSCode 设置好看的字体:Operator Mono
  11. Python网页编程(CGI)
  12. sprd 11 播放视频时开启录屏,视频闪烁或提示正在加载问题
  13. systemd 简介
  14. js判断字符串字符数(汉字算两个)
  15. 神经网络预测鸢尾花的种类
  16. Mac OS之Latex(MacTeX)初体验
  17. GeoServer结合FWTools切片工具发布影像金字塔切片
  18. ActiveReportsJS3.0 详解 ActiveReportsJS3.X
  19. echarts 实现横坐标只显示第一个和最后一个自定义的内容
  20. 16个时髦的扁平化设计的 HTML5 CSS3 网站模板

热门文章

  1. MySQL使用group by分组查询每组最新的一笔数据
  2. uploader什么意思_webuploader
  3. Prompt learning系列之入门篇
  4. 计算机地图制图的优势,计算机地图制图
  5. 计算机科学与技术反思录
  6. 软件工程网络15个人作业3——案例分析(201521123107)
  7. 利用CSS让dl dt dd呈现多行多列效果
  8. 给定C语言数据结构,给定C语言的数据结构struct T { int w; union T { char c;int i;double d;)U; };...
  9. SATA、AHCI、ATA等相关知识概述
  10. greenplum 历史拉链表