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

工商营业执照号码长度按工商规定为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. mysql链接

    一 Mysql命令行连接 一般对于刚刚安装好的mysql,如果勾选启用mysql lineclient的话.可以直接通过找到开始---程序--- mysql command line client如下 ...

  2. 【机器学习】从分类问题区别机器学习类型 与 初步介绍无监督学习算法 PAC

    如果要对硬币进行分类,我们对硬币根据不同的尺寸重量来告诉机器它是多少面值的硬币 这种对应的机器学习即使监督学习,那么如果我们不告诉机器这是多少面额的硬币,只有尺寸和重量,这时候让机器进行分类,希望机器 ...

  3. dblink(转)

    oracle在进行跨库访问时,可以通过创建dblink实现,今天就简单的介绍下如果创建dblink,以及通过dblink完成插入.修改.删除等操作 首先了解下环境:在tnsnames.ora中配置两个 ...

  4. idea如何将项目以eclipse保存

    会生成 提交到svn     eclipse 导入 首先使用TortoiseSVN下载要导入的项目 导入 已经存在的maven 项目       clean install -DskipTests t ...

  5. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)

    传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...

  6. 2018.11.30 bzoj3230: 相似子串(后缀数组)

    传送门 后缀数组入门题. 建立正反两个后缀数组算就行了. 代码: #include<bits/stdc++.h> #define ri register int using namespa ...

  7. java Concurrent包学习笔记(七):ConcurrentHashMap

    (注意:以下讲解的ConcurrentHashMap是jdk 1.8的) 一.ConcurrentHashMap的数据结构 ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上 ...

  8. Linux基础笔记

    基本命令: man man  查看手册 (1)pwd  显示路径 (2)cd  切换路径 (3)ls -a;-l;-h;-i;-d (隐藏的:长列表显示:human显示:索引号:只显示列表) (4)c ...

  9. Mybatis-Plus 实战完整学习笔记(一)------简介

    第一章    简介      1. 什么是MybatisPlus                MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只 ...

  10. querySelectorAll()方法

    querySelectorAll()方法 调用的对象包括:Document(文档) DocumentFragment(文档片段) Element(元素) querySelectorAll()方法接收的 ...