关于18位组织机构代码校验规则

   function checkCode(code) {
            if (code.length != 18) {
                alert("社会信用代码长度错误!");
                return false;
            }
            var reg = /^([0-9ABCDEFGHJKLMNPQRTUWXY]{2})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9XY])$/;
            if (!reg.test(code)) {
                alert("社会信用代码校验错误!");
                return false;
            }
            var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
            var ws = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
            var codes = new Array();
            codes[0] = code.substr(0, code.length - 1);
            codes[1] = code.substr(code.length - 1, code.length);
            var sum = 0;
            for (var i = 0; i < 17; i++) {
                sum += str.indexOf(codes[0].charAt(i)) * ws[i];
            }
            var c18 = 31 - (sum % 31);
            if (c18 == 31) {
                alert("第18位 == 31");
                c18 = 'Y';
            } else if (c18 == 30) {
                alert("第18位 == 30");
                c18 = '0';
            }
            if (c18 != codes[1]) {
                alert("社会信用代码有误!" + c18);
                return false;
            }
        }

    
    请问大神有没有18位组织机构代码校验规则,网上很多有误。包括上面这个也是有问题。举例:‘91350000MA2Y31FH5’
回复
阅读 2.2k
2 个回答

// 15位组织机构代码

businessLicense15: (ints){
    let ti = 0;  
    let si = 0;// pi|11+ti  
    let cj = 0;// (si||10==0?10:si||10)*2  
    let pj = 10;// pj=cj|11==0?10:cj|11  
    let lastNum = '';
    for (let i=0;i<ints.length;i++) {  
        ti = parseInt(ints[i]);  
        si = pj + ti; 
        cj = (0 == si % 10 ? 10 : si % 10) * 2; 
        pj = cj % 11;  
         
        if (i == ints.length-1) {  
            //lastNum =(1 - pj < 0 ? 11 - pj : 1 - pj) % 10;  
            lastNum = si%10
        }  
    }  
   
    if(lastNum==1){
        return true;
    }else{
        return false
    }
      
},
// 18位组织机构代码
businessLicense:(value) {

    if (value.length == 15) {
        console.log(123)
        return businessLicense15(value);
    } else {

        var reg = /^([159Y]{1})([1239]{1})([0-9ABCDEFGHJKLMNPQRTUWXY]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9ABCDEFGHJKLMNPQRTUWXY])$/;
        if (!reg.test(value)) {
            console.log(334234);
            return false;
        }
        var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
        var ws = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
        var codes = new Array();
        codes[0] = value.substr(0, value.length - 1);
        codes[1] = value.substr(value.length - 1, value.length);
        var sum = 0;
        for (var i = 0; i < 17; i++) {
            sum += str.indexOf(codes[0].charAt(i)) * ws[i];
        }
        var c18 = 31 - (sum % 31);

        if (c18 == 31) {

            c18 = 'Y';
        } else if (c18 == 30) {

            c18 = '0';
        }
        if (str.charAt(c18) != codes[1].charAt(0)) {

            return false;
        }

        return true;
    }
}

可以调个真实接口去查一下保证准确性

宣传栏