精华内容
下载资源
问答
  • 统一社会信用代码校验java代码写的,是一个老前辈给的校验规则,我手动用代码实现了,试了适用正常的税号。
  • 统一社会信用代码校验python实现,统一社会信用代码校验python实现
  • oracle统一社会信用代码校验函数
  • 本文档只说明统一社会信用代码的构成,编码规则,和校验位的计算规则,不设计具体的代码实现。 不过根据编码规则可以使用任何开发语言实现校验功能。
  • 校验统一社会信用代码的合法性,是SQL2008的标量函数
  • 用js写的校验统一社会信用代码,项目中用到的,测试可用。
  • 根据《GB 32100-2015法人和其他组织统一社会信用代码编码规则》编写代码规则,进行了实测,并用于现实使用中。
  • js写的一个校验脚本,完全符合校验规则,方便校验,也可以写在程序中作为校验
  • 实现统一社会信用代码校验

    万次阅读 2016-06-09 05:24:20
    社会信用代码:由18位数字和大写的字母组成,第1位是...具体详情请点击:统一社会信用代码编码规则具体的实现代码如下:import java.util.HashMap; import java.util.Map; /** * Desc: 社会信用代码证 检验 * Cre...

    社会信用代码:由18位数字和大写的字母组成,第1位是登记管理部门代码,第2位是机构类别代码,第3~8位登记管理机关行政区划码,第9~17位主休标识码,第18位校验码。有五个部分组成。

    具体详情请点击:统一社会信用代码编码规则

    具体的实现代码如下:

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Desc: 社会信用代码证 检验
     * Created  2016/5/18.
     */
    class Regex_CreditCode {
        static String creditCode = "91350100M000100Y43";// 测试
        static String isCreditCode = "true";
        static String error_CreditCode = "社会信用代码有误";
        static String error_CreditCode_min = "社会信用代码不足18位,请核对后再输!";
        static String error_CreditCode_max = "社会信用代码大于18位,请核对后再输!";
        static String error_CreditCode_empty ="社会信用代码不能为空!";
        private static Map<String,Integer> datas = null;
        private static char[] pre17s;
        static int[] power = {1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28};
    	// 社会统一信用代码不含(I、O、S、V、Z) 等字母
        static char[] code = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','T','U','W','X','Y'};
        public  static  void main(String[] args){
            String temp = creditCode;
            System.out.println(temp);
            initDatas(code.length);
            pre17(temp);
            isCreditCode(temp);
        }
    
        /**
         * 判断是否是一个有效的社会信用代码
         * @param creditCode
         * @return
         */
        static String isCreditCode(String creditCode){
            if("".equals(creditCode)||" ".equals(creditCode)){
                System.out.println(error_CreditCode_empty);
                return error_CreditCode_empty;
            }else if(creditCode.length()<18){
                System.out.println(error_CreditCode_min);
                return  error_CreditCode_min;
            }else if(creditCode.length()>18){
                System.out.println(error_CreditCode_max);
                return  error_CreditCode_max;
            }else{
                int sum =  sum(pre17s);
                int temp = sum%31;
                temp = temp==0?31:temp;//  谢谢 whhitli的帮助
                System.out.println(code[31-temp]+" "+(creditCode.substring(17,18).equals(code[31-temp]+"")?isCreditCode:error_CreditCode));
                return creditCode.substring(17,18).equals(code[31-temp]+"")?isCreditCode:error_CreditCode;
            }
        }
    
        /**
         * @param chars
         * @return
         */
        private static int sum(char[] chars){
            int sum = 0;
            for(int i=0;i<chars.length;i++){
                int code = datas.get(chars[i]+"");
                sum+=power[i]*code;
            }
            return sum;
    
        }
    
        /**
         * 获取前17位字符
         * @param creditCode
         */
        static  void  pre17(String creditCode){
            String pre17 = creditCode.substring(0,17);
            pre17s = pre17.toCharArray();
        }
    
        /**
         * 初始化数据
         * @param count
         */
        static void  initDatas(int count){
            datas = new HashMap<>();
            for(int i=0;i<code.length;i++){
                datas.put(code[i]+"",i);
            }
            System.out.println();
        }
    }
    






    展开全文
  • 18位统一代码最后一位计算方法如下:```def unioncode_checknum(code):alpha_to_num_map={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'J':18,'K':19,'L':20,'M':21,'N':22,'P':23,'Q':24,'R':25,'T':...

    18位统一代码最后一位计算方法如下:

    ```

    def unioncode_checknum(code):

    alpha_to_num_map={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'J':18,'K':19,'L':20,'M':21,'N':22,'P':23,'Q':24,'R':25,'T':26,'U':27,'W':28,'X':29,'Y':30}

    num_to_alpha_map={}

    for k,v in alpha_to_num_map.items():

    num_to_alpha_map[v]=k

    print(num_to_alpha_map)

    weights = [1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28]

    total = 0

    for i in range(len(code)):

    c = code[i]

    if not c.isdigit():

    total+=alpha_to_num_map[c]*weights[i]

    else:

    total+=int(c)*weights[i]

    pos = 31-(total%31)

    if pos==31:

    return 0

    if pos<10:

    return pos

    else:

    return num_to_alpha_map[pos]

    ```

    统一社会信用代码定义:

    展开全文
  • } /** * 统一社会信用代码校验 * @param uniCode */ public static checkUnifiedCreditCode(uniCode: string): ProcessResult { // 假如不是18位,错误 if (!uniCode || uniCode.length !== 18) { return new ...

    话不多说,直入正题: 

    1、工具类: 

    import * as moment from 'moment';
    import {isUndefined} from 'util';
    import {AbstractControl, ValidatorFn} from '@angular/forms';
    
    /**
     * Created by yanchao lcj on 2020/06/28.
     */
    export class StringUtils {
    
        constructor() {
        }
    
        /**
         * 判断是空字符串?
         * @param str
         */
        static isBlank(str: string) {
            return isUndefined(str) || str === null || '' === str.trim();
        }
    
        /**
         * 去空格
         * @param str 处理字符串
         * @return 结果字符串
         */
        static trim(str: string) {
            return str.replace('\n', '').replace(' ', '').trim();
        }
    
        /**
         * 判断不是空字符串?
         * @param str
         */
        static isNotBlank(str: string) {
            return !this.isBlank(str);
        }
    
        /**
         * 判断是空?
         * @param o
         */
        static isEmpty(o) {
            return o === null || o === 'null' || o === undefined || o === 'undefined' || o === '';
        }
    
        /**
         * 判断不是空?
         * @param o
         */
        static isNotEmpty(o) {
            return !this.isEmpty(o);
        }
    
        /**
         * 校验身份证的
         * @param code
         */
        public static identityCodeValid(code): ProcessResult {      
            // 判断是否为空 长度是否合法
            if (this.isBlank(code) || code.length !== 18) {
                return new ProcessResult(false, '身份证长度不够');
            }
            code = this.trim(code);
            // 身份证号格式错误
            if (!code || !/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(code)) {
                return new ProcessResult(false, '身份证不合法');
            }
            // 省份对应的省编码
            const city = {
                11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江', 31: '上海',
                32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南',
                44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西',
                62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外'
            };
            if (!city[code.substr(0, 2)]) {
                // 地址编码错误
                return new ProcessResult(false, '身份证前2为输入有误');
            } else {
                // 18位身份证需要验证最后一位校验位
                code = code.split('');
                // 身份证最后一位
                const lastOneCode = code[17];
                // 加权因子 ∑(ai×Wi)(mod 11)
                const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                // 校验位
                const parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
                let sum = 0;
                let ai = 0;
                let wi = 0;
                // 取前17位,(每一位数字 * 每一位数字在加权因子数组的对应的数字) 之和
                for (let i = 0; i < 17; i++) {
                    ai = code[i];
                    wi = factor[i];
                    sum += ai * wi;
                }
                // 算出来的和 mod 11 得到 最后一位,再把传进来的身份证的最后一位和算出来的最后一位对比
                return new ProcessResult(parity[sum % 11] === lastOneCode, '身份证不合法');
            }
        }
    
        /**
         * 身份证自定义校验器
         */
        public static idCardNoValidator(): ValidatorFn {
            return (control: AbstractControl): { [key: string]: any } | null => {
                const processResult = this.identityCodeValid(control.value);
                return processResult.isSuccess() ? null : {idCardError: {value: control.value, message: processResult.errorMessage}};
            };
        }
    
        /**
         * 统一社会信用代码自定义校验器
         */
        public static unifiedCreditCodeValidator(): ValidatorFn {
            return (control: AbstractControl): { [key: string]: any } | null => {
                const processResult = this.checkUnifiedCreditCode(control.value);
                return processResult.isSuccess() ? null : {unifiedCreditCodeError: {value: control.value, message: processResult.errorMessage}};
            };
        }
    
        /**
         * 统一社会信用代码校验
         * @param uniCode
         */
        public static checkUnifiedCreditCode(uniCode: string): ProcessResult {      
            // 假如不是18位,错误
            if (!uniCode || uniCode.length !== 18) {
                return new ProcessResult(false, '统一社会信用代码长度不合法');
            }
            uniCode = this.trim(uniCode);
            // 统一社会信用代码由18位阿拉伯数字或英文大写字母表示(不包括I,O,Z,S,V以防止和阿拉伯字母混淆)-->V:???关我毛事?
            const upUniCode = uniCode.toUpperCase();
            if (upUniCode.indexOf('I') !== -1 || upUniCode.indexOf('O') !== -1 || upUniCode.indexOf('Z') !== -1 || upUniCode.indexOf('S') !== -1 || upUniCode.indexOf('V') !== -1) {
                return new ProcessResult(false, '统一社会信用代码不能含有(I,O,Z,S,V)');
            }
            // (组织机构代码)校验
            const orgCheckCode = [
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z'
            ];
            // 组织机构代码加权因子
            const orgWeight = [3, 7, 9, 10, 5, 8, 4, 2];
            const orgCode = uniCode.substr(8, 9);
            let sumOrg = 0;
            // 去前8位数 每一位数对应在orgWeight数组的下标 * 对应的加权因子 之和
            for (let i = 0; i < 8; i++) {
                const tmpAttr = orgCode[i] as any;
                const tmpCode = orgCheckCode.indexOf(tmpAttr);
                const tmpWeight = orgWeight[i];
                sumOrg += (tmpCode * tmpWeight);
            }
            // 再用11 - 算出的合数 mod 11
            const modOrg = 11 - sumOrg % 11;
            // 再用算出来的数字转换成最后一位的数字 拿到最后一个字符
            const modOrgLast = (modOrg === 10) ? 'X' : ((modOrg === 11) ? '0' : ('' + modOrg));
            // 对比算出来的最后一位是否等于给我的组织机构代码的最后一位
            if (modOrgLast !== orgCode[8]) {
                return new ProcessResult(false, '统一社会信用代码中的组织机构代码不合法');
            }
            // 最后一位的校验 (A=10, B=11,以此类推)
            const uniCheckCode = [
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q',
                'R', 'T', 'U', 'W', 'X', 'Y'
            ];
            // 统一社会信用代码加权因子
            const uniCodeWeight = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
            let sumUniCode = 0;
            // 去前17位数 每一位数对应在uniCheckCode数组的下标 * 对应的加权因子 之和
            for (let i = 0; i < 17; i++) {
                const tmpAttr = uniCode[i] as any;
                const tmpCode = uniCheckCode.indexOf(tmpAttr);
                const tmpWeight = uniCodeWeight[i];
                sumUniCode += (tmpCode * tmpWeight);
            }
            // 再用31 - 算出的合数 mod 31
            const modOrgUni = 31 - sumUniCode % 31;
            // 在uniCheckCode数组找出对应的字符就是最后一位
            const modOrgUniLast = uniCheckCode[modOrgUni % 31];
            // 对比算出来的最后一位是否等于给我的信用代码的最后一位
            return new ProcessResult(modOrgUniLast + '' === uniCode[17] + '', '统一社会信用代码不合法');
        }
    
        /**
         * 根据身份证号码获取生日年龄性别
         */
        public static getIdCardInformation(idCardNo): IdCardInformation {
            const processResult = this.identityCodeValid(idCardNo);
            if (processResult.isFailure()) {
                return new IdCardInformation(undefined, undefined, undefined);
            }
            // 区分二代身份证
            const mark = idCardNo.length > 15;
            // 获取身份证上的出生日期
            const birthday = moment(idCardNo.substring(6, mark ? 14 : 11), 'YYYYMMDD').toDate();
            // 算出年龄
            const age = new Date().getFullYear() - birthday.getFullYear();
            // 得出年龄
            const gender = !(Number(idCardNo.charAt(mark ? 16 : 14)) % 2 === 0);
            // 返回身份证信息
            return new IdCardInformation(birthday, age, gender);
        }
    }
    
    /**
     * 身份证信息
     */
    class IdCardInformation {
    
        /**
         * 出生日期
         */
        birthday: Date;
    
        /**
         * 年龄
         */
        age: number;
    
        /**
         * 性别
         */
        gender: boolean;
    
        constructor(birthday: Date, age: number, gender: boolean) {
            this.birthday = birthday;
            this.age = age;
            this.gender = gender;
        }
    }
    
    /**
     * 处理结果
     */
    class ProcessResult {
    
        /**
         * 成功?
         */
        success: boolean;
    
        /**
         * 错误信息
         */
        errorMessage: string;
    
        constructor(success: boolean, errorMessage: string) {
            this.success = success;
            this.errorMessage = errorMessage;
        }
    
        /**
         * 是成功的?
         */
        isSuccess() {
            return this.success;
        }
    
        /**
         * 是失败的?
         */
        isFailure() {
            return !this.success;
        }
    }
    

    2、表单对象 :

    this.formGroup = this.fb.group({
        // 证件号码
        idCard: [null, [Validators.required, StringUtils.idCardNoValidator()]]
    });

     3、页面用管道显示错误信息:

    <nz-form-item>
        <nz-form-label [nzSm]="4" [nzXs]="12" nzRequired>证件号码</nz-form-label>
            <nz-form-control [nzValidateStatus]="formGroup.get('idCard')"
                                 nzHasFeedback [nzErrorTip]="formGroup.get('idCard').errors | errorMessage"
                                 [nzSm]="7" [nzXs]="12">
                <input nz-input formControlName="idCard" placeholder="请输入证件号码"/>
        </nz-form-control>
    </nz-form-item>

    4、管道的类:

    import {Pipe, PipeTransform} from '@angular/core';
    import {ValidationErrors} from '@angular/forms';
    
    @Pipe({
        name: 'errorMessage'
    })
    export class ErrorMessagePipe implements PipeTransform {
    
        constructor() {
        }
    
        errors: ValidationErrors;
    
        formatError(key) {
            switch (key) {
                case 'required':
                    return '必填项';
                case 'idCardError':
                    return this.errors[key].message;
                case 'unifiedCreditCodeError':
                    return this.errors[key].message;
                default:
                    return '';
            }
        }
    
        transform(errors: ValidationErrors): any {
            this.errors = errors;
            // tslint:disable-next-line:forin
            for (const key in errors) {
                return this.formatError(key);
            }
        }
    
    }
    

    效果:

     

     

    5、校验身份证获取身份证信息:

    const value = "身份证号码";
    
    // 获取身份证里面的信息如:出生日期 年龄 性别  当然还可以获得出生地,这里我没实现
    const idCardInformation = StringUtils.getIdCardInformation(value);
    
    // 身份证校验
    const success = StringUtils.identityCodeValid(value).isSuccess();
    
    // 统一社会信用代码校验
    const success1 = StringUtils.checkUnifiedCreditCode(‘****’).isSuccess();

     

     

     

    展开全文
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...

    为啥要造

    前几天开发一个项目,前端需要校验用人单位的统一社会信息用代码,然后网上搜了下感觉网上的代码都比较长(有的还需要积分才能t下载~~~),我们这个要求比较简单所以就用ES6重写了下。

    校验规则

    根据统一社会信息用代码编码规则, 这里的编码规则主要有以下六点:

    1. 18位的数字及大写英文字母(不包括I/O/Z/S/V);
    2. 第1位是登记管理部门代码, 目前最新规则是1-9加上ANY,([1-9ANY]{1});
    3. 第2位是登记管理部门的机构类别代码,全部是数字,([1-9]{1})
    4. 第3至8位是行政区划代码,全部是数字,([0-9]{6})
    5. 第9至18位由数字和大写英文字母组成,([0-9A-HJ-NP-RT-UW-Y]{10})
    6. 第18位是校验码,由前17位通过如下规则计算得到的(类似于身份证号的校验方式)
      C18=31MOD(i=117Ci×Wi,31) C_{18}=31-MOD(\sum_{i=1}^{17}C_{i}\times W_{i} ,31)

    你可以找到完整的 统一社会信息用代码编码规则 完整编码规则传送门.
    戳我查看最新的 登记管理部门代码标识 国家标准第1号修改单传送门.

    校验代码

    好了,上面废话这么多,这就把代码奉上,这里我们是把这个校验放到工具文件里面然后在需要的地方引入,所以export开头。如果是不从其他文件引入把export const换成function就好了。
    看了下网上有说发证社会信息用代码校验计算通不过的情况校验码问题,经过测试确实存在,考虑到这种情况,加个了是否启用校验码校验参数(默认不启用)。

    /**
     * 校验统一社会信用代码
     * @param val{String}
     * @param checkEnable{Boolean}
     * @returns {Boolean}
     */
    export const isSocialCreditCode = (val, checkEnable = false) => {
    	// 前置条件即校验规则的第1至5要求
    	const pattern = /^([1-9ANY])([1-9])([0-9]{6})([0-9A-HJ-NP-RT-UW-Y]{10})$/;
    	if (!pattern.test(val) || !checkEnable) return pattern.test(val);
    	// 定义求模基数31
    	const MODE_BASE = 31;
    	// 空字符串
    	const EMPTY_STR= "";
    	// 代码字符数组, 其下标作为代码字符数值
    	const CHAR_CODES = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y'];
    	// 各位置序号上的加权因子
    	const WEIGHT_FACTORS = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
    	// 初始化一个与信用代码等长的空的代码字符数值数组
    	// 用于和加权因子进行乘积求和运算
    	let values = new Array(val.length);
    	// 初始化求和值
    	let sum = 0;
    	// 将信用代码字符串转换为代码字符数值数组
    	val.split(EMPTY_STR).forEach((item, index) => values[index] = CHAR_CODES.findIndex(elem => elem === item));
    	// 删除最后一位元素(第18位不参与求和计算)
    	const endValue = values.pop();
    	// 将字符数组数值逐个元素与加权因子乘积求和
      	WEIGHT_FACTORS.forEach((item, index) => sum += item * values[index]);
    	// 换算校验代码字符
    	// let checkCode = CHAR_CODES[MODE_BASE - sum % MODE_BASE];
    	// return val.substring(17, 18) === checkCode;
    	// 不换算回字符了,直接用第18位的数值进行比较
    	return endValue === (MODE_BASE - sum % MODE_BASE);
    }
    
    展开全文
  • 统一社会信用代码校验和生成

    千次阅读 2020-04-08 12:43:13
    } } /** * 校验统一社会信用代码 * @param str 统一社会信用代码 * @return true 校验通过,else false */ public static boolean checkCompanySocialId(String str) { if (str == null || str.length() !...
  • isCreditCode: function (str_data) { //社会信用代码验证 var patrn = /^[0-9A-Z]+$/; //18位校验及大写校验 if ((str_data.length != 18) || (p...
  • B话少说,上代码 package com.microlinktech.rns.util; import lombok.Getter; import lombok.NoArgsConstructor; import org.apache.commons.lang.StringUtils; import java.text.SimpleDateFormat; import ...
  • JS--统一社会信用代码校验

    万次阅读 2017-12-27 17:32:39
    function CheckSocialCreditCode(Code) { var patrn = /^[0-9A-Z]+$/; //18位校验及大写校验 if ((Code.length != 18) || (patrn.test(Code) =... console.info("不是有效的统一社会信用编码!"); return false; }
  • function CheckSocialCreditCode(Code) {  var patrn = /^[0-9A-Z]+$/; //18位校验及大写校验  if ((Code.length != 18) || (patrn.test(Code) == false)) ... alert("不是有效的统一社会信用编码!"); ...
  • 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成。 本体代码采用系列(即分区段)顺序编码方法。 校验码按照以下公式计算: C9=11-MOD(∑Ci(i=1→8)×Wi,11) 式中...
  • GB 32100-2015 法人和其他组织统一社会信用代码编码规则 private static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY"; private static final char[] BASE_CODE_ARRAY...

空空如也

空空如也

1 2 3 4 5
收藏数 96
精华内容 38
关键字:

统一社会信用代码校验