身份证校验、信用代码校验函数(.ts)

感谢

参考链接:https://www.sohu.com/a/113160283_397688(信用代码校验)https://www.jianshu.com/p/ead5b08e9839(身份证校验)

前言

蛇精病,非得要身份证和信用代码校验,过分。

身份证校验规则


18位的身份证,刺激:

  1. 前6位: 登记户口时所在地的行政区划代码
  2. 第7-14位: 机智的你肯定猜到是出生年月日
  3. 第15-17位: 顺序码,女孩子为偶数喔,男生是奇数(暗搓搓思考:人类祖母“露西”(Lucy)的身份证号是啥样的)
  4. 第18位: 校验码
    15位的身份证,简洁:
  5. 前6位: 同上
  6. 第7-12位: 虽然只有六位,例如100226,表示1910年02月26日,哈哈哈,是不是有种你们就不能多想几百年,省的再改了的感觉,哈哈哈哈。
  7. 第13-14位: 顺序码
  8. 第15位: 性别,女偶男奇~~~

统一社会信用代码校验规则


  1. 第1位: 登记管理部门代码(共一位字符)
  2. 第2位: 机构类别代码(共一位字符)
  3. 第3位-第8位: 登记管理机关行政区划码(共六位阿拉伯数字)
  4. 第9位~第17位: 主体标识码(组织机构代码)(共九位字符)
  5. 第18位: 校验码(共一位字符)

代码片

这里面的代码是一个简单的校验,还有很多需要精细校验的地方,例如:吧拉吧鲁啦···,你可以吐槽,但我不想改。没多大意思,请需要的同学们自己微调吧,哈哈哈。

代码片 新建:UtilRoles.ts

const UtilRoles = {

    // 身份证校验
    checkIdCard(idCard: string) {

        // areaCode:地区码  checkCode:最后一位的校验码
        const areaCode = [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];
        const checkCode = ['1','0','X','9','8','7','6','5','4','3','2'];
        
        if (idCard.length === 15) {               // 如果是15位的身份证号码

            // 判断地区码
            const idCardAreaCode = parseInt(idCard.substr(0, 2));
            if (areaCode.indexOf(idCardAreaCode) === -1) {
                return false;
            }

            // 判断时间
            const borthYear = parseInt(idCard.substr(6, 2)) + 1900;
            const isRunNian = (borthYear % 400 === 0) || (borthYear % 100 !== 0 && borthYear % 4 === 0);
            let regStr = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;
            if (isRunNian) {
                regStr = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;
            }
            if (!idCard.match(regStr)) {
                return false;
            }

            return true;
        } else if (idCard.length === 18) {        // 如果是18位的身份证号码

            // 判断地区码
            const idCardAreaCode = parseInt(idCard.substr(0, 2));
            if (areaCode.indexOf(idCardAreaCode) === -1) {
                return false;
            }

            // 判断时间
            const borthYear = parseInt(idCard.substr(6, 4));
            const isRunNian = (borthYear % 400 === 0) || (borthYear % 100 !== 0 && borthYear % 4 === 0);         
            let regStr = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;
            if (isRunNian) {
                regStr = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;
            }
            if (!idCard.match(regStr)) {
                return false;
            }

            // 判断最后一位---校验码
            const sumIdCard = (parseInt(idCard.substr(0, 1)) + parseInt(idCard.substr(10, 1))) * 7 +
                (parseInt(idCard.substr(1, 1)) + parseInt(idCard.substr(11, 1))) * 9 +
                (parseInt(idCard.substr(2, 1)) + parseInt(idCard.substr(12, 1))) * 10 +
                (parseInt(idCard.substr(3, 1)) + parseInt(idCard.substr(13, 1))) * 5 +
                (parseInt(idCard.substr(4, 1)) + parseInt(idCard.substr(14, 1))) * 8 +
                (parseInt(idCard.substr(5, 1)) + parseInt(idCard.substr(15, 1))) * 4 +
                (parseInt(idCard.substr(6, 1)) + parseInt(idCard.substr(16, 1))) * 2 +
                parseInt(idCard.substr(7, 1)) * 1 + parseInt(idCard.substr(8, 1)) * 6 +
                parseInt(idCard.substr(9, 1)) * 3;
            const modNum = checkCode[sumIdCard % 11];
            if (modNum !== idCard.substr(17, 1).toUpperCase()) {
                return false;
            }

            return true
        } else {
            return false;
        }

    },

    // 统一社会信用代码校验
    checkSocialUniCode(uniCode: string) {

        // 假如不是18位,错误
        if (uniCode.length !== 18) {
            return false;
        }

        // 统一社会信用代码由18位阿拉伯数字或英文大写字母表示(不包括I,O,Z,S,V以防止和阿拉伯字母混淆)-->V:???关我毛事?
        const UpUniCode = uniCode.toUpperCase();
        if (UpUniCode.indexOf("I") !== -1) {
            return false;
        }
        if (UpUniCode.indexOf("O") !== -1) {
            return false;
        }
        if (UpUniCode.indexOf("Z") !== -1) {
            return false;
        }
        if (UpUniCode.indexOf("S") !== -1) {
            return false;
        }
        if (UpUniCode.indexOf("V") !== -1) {
            return false;
        }

        // (组织机构代码)校验
        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;        
        for (let i = 0; i < 8; i++) {
            let tmpAttr = orgCode[i] as any;
            let tmpCode = orgCheckCode.indexOf(tmpAttr);
            let tmpWeight = orgWeight[i]
            sumOrg += (tmpCode * tmpWeight);
        }
        const modOrg = 11 - sumOrg % 11;
        const modOrgLast = (modOrg === 10) ? "X" : ((modOrg === 11) ? "0" : ("" + modOrg));
        if (modOrgLast !== orgCode[8]) {
            return false;
        }

        // 最后一位的校验
        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;
        for (let i = 0; i < 17; i++) {
            let tmpAttr = uniCode[i] as any;
            let tmpCode = uniCheckCode.indexOf(tmpAttr);
            let tmpWeight = uniCodeWeight[i];
            sumUniCode += (tmpCode * tmpWeight);
        }
        const modOrgUni = 31 - sumUniCode % 31;
        const modOrgUniLast = orgCheckCode[modOrgUni];
        if (modOrgUniLast !== uniCode[17]) {
            return false;
        }




        return true;
    }

}


export default UtilRoles;

代码片 如何使用
在你的函数里:直接用

// 你的待校验的数据
let testIdCard="1234678978";
let testUniCode="12344";
// 身份证
if(UtilRoles.checkIdCard(testIdCard)){
	// 校验成功执行。。。
}
// 信用代码
if(UtilRoles.checkSocialUniCode(testUniCode)){
	// 校验成功执行。。。
}

最后

写的太粗糙了,大家凑活着看吧,抱歉,打扰了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值