从本质上讲,工商营业执照号码和统一社会信用代码是两套完全不一样的编码规则,识别结果也仅有行政区划部分为两者共有,但因为这两种编码同时存在的原因,所以如果需要在系统中唯一标志一家企业时,还是可以通过工商营业执照号码或统一社会信用代码来进行识别。

工商营业执照号码长度按工商规定为15位,统一社会信用代码按国家规定是18位,你可以在此类库的验证基础上,通过其它网站(比如企查查)来进一步查验企业是否真实存在。

NumberValidators中,该部分验证相关的内容均在NumberValidators.BusinessRegistrationNos下,你可以在此处查看具体源代码。

IRegistrationNoValidator约定了要实现的验证的规范。

    /// <summary>
/// 工商注册码/统一社会信用代码验证接口
/// </summary>
public interface IRegistrationNoValidator<out TResult> : IValidator<TResult>
where TResult : RegistrationNoValidationResult, new()
{
/// <summary>
/// 用于验证的行政区划字典数据
/// </summary>
IValidationDictionary<int, string> Dictionary { get; set; }
/// <summary>
/// 号码长度
/// </summary>
RegistrationNoLength RegistrationNoLength { get; }
/// <summary>
/// 验证号码是否正确
/// </summary>
/// <param name="code">待验证的工商注册码/统一社会信用代码</param>
/// <param name="validLimit">行政区划验证限制,因为存在工商管理机构代码,所以默认为null</param>
/// <returns></returns>
TResult Validate(string code, AreaValidLimit? validLimit = null);
}

验证结果定义如下:

  • RegistrationNoValidationResult 默认验证结果类
  • RegistrationNo15ValidationResult 工商营业执照特有的验证结果类
  • RegistrationNo18ValidationResult 统一社会信用代码特有的验证结果类

RegistrationNoValidationResult代码如下

    /// <summary>
/// 注册码通用验证结果类
/// </summary>
public class RegistrationNoValidationResult : ValidationResult
{
/// <summary>
/// 行政区划或工商行政管理机关编码
/// </summary>
public int AreaNumber { get; internal set; }
/// <summary>
/// 身份证颁发行政区域或工商行政管理机关(识别出Depth最深的区域),可通过FullName来获取完整的名称
/// 注意此处有可能为null
/// </summary>
public Area RecognizableArea { get; internal set; }
/// <summary>
/// 号码长度
/// </summary>
public RegistrationNoLength RegistrationNoLength { get; internal set; }
/// <summary>
/// 校验码
/// </summary>
public char CheckBit { get; internal set; }
}

RegistrationNo15ValidationResultRegistrationNoValidationResult的基础上额外包含了工商营业执照专有的识别信息,你可以通过该部分得知该企业是内资企业、外资企业还是个体户

   /// <summary>
/// 工商行政管理市场主体注册号 专用验证结果类
/// </summary>
public class RegistrationNo15ValidationResult : RegistrationNoValidationResult
{
/// <summary>
/// 顺序码
/// </summary>
public int SequenceNumber { get; internal set; }
/// <summary>
/// 企业类型
/// </summary>
public EnterpriseType EnterpriseType
{
get
{
var comp = this.SequenceNumber / 10000000;
if (comp <= (int)EnterpriseType.Domestic)
{
return EnterpriseType.Domestic;
}
else if (comp <= (int)EnterpriseType.Foreign)
{
return EnterpriseType.Foreign;
}
else { return EnterpriseType.Individual; }
}
}
}

RegistrationNo18ValidationResult则是在RegistrationNoValidationResult的基础上额外包含了社会统一信用代码的专有信息,你可以通过该部分信息得知其登记管理部门,以及其组织机构代码

    /// <summary>
/// 法人和其他组织统一社会信用代码 专用验证结果类
/// </summary>
public class RegistrationNo18ValidationResult : RegistrationNoValidationResult
{
/// <summary>
/// 登记管理部门代码标志
/// </summary>
public ManagementCode ManagementCode { get; internal set; }
/// <summary>
/// 登记管理部门下机构类别代码标志
/// </summary>
public ManagementKindCode ManagementKindCode { get; internal set; } = ManagementKindCode.NonSpecific;
/// <summary>
/// 组织机构代码,遵循GB/T 11714-1997
/// </summary>
public string OrganizationCode { get; internal set; }
}

可根据IsValid来判断验证是否成功,如果验证失败,Errors 属性则包含了验证失败的原因,具体的错误原因列表如下

    /// <summary>
/// 错误提示信息类
/// </summary>
internal class ErrorMessage
{
/// <summary>
/// 字符串为空
/// </summary>
public const string Empty = "工商注册码/统一社会信用代码为空";
/// <summary>
/// 号码错误
/// </summary>
public const string Error = "错误的工商注册码/统一社会信用代码";
/// <summary>
/// 无效的登记管理部门代码
/// </summary>
public const string InvalidManagement = "无效的登记管理部门代码";
/// <summary>
/// 无效的登记管理部门机构类别代码
/// </summary>
public const string InvalidManagementKind = "无效的登记管理部门机构类别代码";
/// <summary>
/// 无效的组织机构代码
/// </summary>
public const string InvalidOrganizationCode = "无效的组织机构代码";
/// <summary>
/// 行政区划识别失败
/// </summary>
public const string InvalidArea = "工商管理机关或行政区划识别失败";
/// <summary>
/// 错误的校验码
/// </summary>
public const string InvalidCheckBit = "错误的校验码";
/// <summary>
/// 无效实现
/// </summary>
public const string InvalidImplement = "未能找到或无效的 {0} 位工商注册码/统一社会信用代码实现";
/// <summary>
/// 长度错误
/// </summary>
public const string LengthOutOfRange = "工商注册码/统一社会信用代码非 {0} 位";
}

同其它验证类一致,RegistrationNoValidatorHelper可自动识别待识别号码究竟为工商营业执照号码还是社会统一信用代码,当然因为有可能待识别号码哪种号码都不是,所以最终识别结果可能为RegistrationNoValidationResultRegistrationNo15ValidationResultRegistrationNo18ValidationResult中的某一种。

最后是简单的使用示例

            Console.WriteLine("***工商注册码/统一社会信用代码***");
string[] rnArr = { "110108000000016", "91320621MA1MRHG205" };
foreach (var rn in rnArr)
{
var valid = RegistrationNoValidatorHelper.Validate(rn, validLimit: null);
Console.WriteLine("{0}验证结果:{1} 长度{2} 行政区划名称({3}) 验证结果类型:{4}", rn, valid.IsValid, valid.RegistrationNoLength, valid.RecognizableArea.FullName, valid);
}
Console.WriteLine("随机的工商注册码:" + new RegistrationNo15Validator().GenerateRandomNumber());
Console.WriteLine("随机的统一社会信用代码:" + new RegistrationNo18Validator().GenerateRandomNumber());

【NumberValidators】工商营业执照号码和统一社会信用代码验证的更多相关文章

  1. 精准准确的统一社会信用代码正则(js)

    参照标准: <GB_32100-2015_法人和其他组织统一社会信用代码编码规则.> 按照编码规则: 统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I.O.Z.S.V)组成 ...

  2. 统一社会信用代码+组织机构代码 校验 python

    转自: https://blog.csdn.net/warrah/article/details/69338912 https://blog.csdn.net/qq_37142340/article/ ...

  3. JS实现统一社会信用代码的效验(组织机构代码效验)

    参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击 ...

  4. 使用js对社会信用代码进行正则验证

    注:参考了该博客(https://blog.csdn.net/qq_37142340/article/details/80695187)进行了一些修改,本文验证使用在微信小程序上. 直接贴代码: va ...

  5. js验证营业执照号码是否合规

    需求:最近要做实名验证的功能,但是验证我们要验证严谨一点,参考了网上关于营业执照号码规则和一些大侠的代码的代码,总结一下. 营业执照号码规则:规则 代码: //方法一:function checkLi ...

  6. 企业工商营业执照副本模板PSD源文件素材下载

    企业工商营业执照副本PSD模板下载地址: http://www.qijieworld.com/thread-1911181-1-1.html 模板为psd格式内容可编辑修改,需使用 Photoshop ...

  7. 用 Prettier 统一团队的代码风格~

    使用 prettier 自動調整 JavaScript 樣式 GFM 格式说明 为什么你不能缺少Linter(以及代码美化工具) 使用 prettier 自動調整 JavaScript 樣式 Reac ...

  8. C# 获取社会统一信用代码

    时间不多,废话少说: 网络请求代码如下: using System; using System.Collections.Generic; using System.Linq; using System ...

  9. 【转】身份证号码校验与信息提取 - Java 代码

    转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148 import java.util.regex.*;   /**   ...

随机推荐

  1. JVM 系列(二)内存模型

    02 JVM 系列(二)内存模型 一.JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域.这些区域有各自的用途.创建/销毁时间: 一. 线程私有区域 线程私有数据区域生 ...

  2. 使用hMailServer搭建邮件服务器

    本文没有什么高深的技术内容,只是使用hMailServer,介绍搭建邮件服务器的全过程,供参考. 一.安装邮件服务器组件 打开软件,点下一步 选择存储数据的数据库,这里有两种选择, 一种是使用嵌入型数 ...

  3. Best Sightseeing Pair LT1014

    Given an array A of positive integers, A[i] represents the value of the i-th sightseeing spot, and t ...

  4. java Mather 的 group 含义

    参考博文:  http://blog.csdn.net/java2king/article/details/4395067  明白了group 的 含义 public class Test { pub ...

  5. putty中查询乱码问题

    我们在putty连接Linux时候,有时候查询会出现乱码问题...如下图 这个是因为putty中设置编码字符集的原因..将此换为utf8格式的即可解决 解决后查询如下:

  6. collection tree protocol

    本文所属图书 > 传感网原理与技术 本书根据<高等院校物联网工程专业发展战略研究报告暨专业规范(试行)>和物联网工程本科专业的教学需要,结合传感网的最新发展及其应用现状编写而成.主要 ...

  7. spring学习 十七 scope属性,单例多例

    Scope属性是<bean>中的属性,取值可以有, singleton 默认值, 单例, prototype 多例, 每次获取重新实例化, request 每次请求重新实例化, sessi ...

  8. 三连击(NOIP1998)

    题目链接:三连击 典型的打表题,但cgg今天不是教你怎么打表的,而是教你正解. 这题方法多样,比如递归求解也行,反正数据也不大. 在这里我提供另一种思路,我们枚举第一个数,即最小的一个数,然后分解它以 ...

  9. MVCS框架的注意点

    1.Service最好用一个接口对应一个service(便于增加扩展方法) 2.除Services和Model外都需继承自各自对应的父类 3.View不要轻易重写Start和Awake方法(含与启动有 ...

  10. vue2.0 移动端,下拉刷新,上拉加载更多插件 转:

    转自:http://www.cnblogs.com/gmajip/p/7204072.html <template lang="html"> <div class ...