集装箱编号校验码规则(JavaScript版本)

集装箱编号校验码规则(JavaScript版本)


最近需要用到校验集装箱号是正确,网上搜了搜箱号的校验规则,写了份demo


贴上具体的计算方法, 参考

你知道吗?每个集装箱的编号都是独一无二的!news.hsdhw.com图标

懒的点的可以看我复制粘贴然后整理的的部分



一、箱号编码的构成
标准集装箱箱号由11位编码组成,包括三个部分:
1、第一部分由4位英文字母组成。
2、第二部分由6位数字组成。
3、第三部分为校验码(Check Digit)由前4位字母和6位数字经过校验规则运算得到,用于识别在校验时是否发生错误。即第11位数字。



二、箱号的校验规则


以CBHU3202732为例
①首先第一部分四个字母分别取它们对应的数字
A=10 B=12 C=13 D=14 E=15 F=16 G=17 H=18 I=19 J=20 K=21 L=23 M=24 N=25 O=26 P=27 Q=28 R=29 S=30 T=31 U=32 V=34 W=35 X=36 Y=37 Z=38


前四个字母分别对应,13、12、18、32
②把数字分别进行处理然后累加
处理方法 ==>> 第N位的箱号对应值乘以2^(N-1) (N=1,2,3………10)

  • C对应13,并且是第一位,那么就是 13*2^(1-1)= 13
  • B对应12,是第二位,那么就是122^(2-1)= 24
  • H ==>>>> 72
  • U ==>>>> 256
  • 然后到了第一个数字3 ==>>>> 3*2^(5-1)= 48

以此类推,一直到第十位计算完成,也就是第六个数字计算完成,然后把这些值累加,为4061
③将累加和对11取模
4061对11取模就是2,也就是说我们的最后一个数字(校验码)应当是2
注意:对11取模后余数可能为两位,如10,那么我们就需要再次对10取模 所以我们可以先对11取模,再对10取模


三、代码


 let check = function (value) {
    let getNumber = new Map();
    let num = 10;
    // 生成字母与数字对照表
    for (let i = 0; i < 26; i++) {
        let word = String.fromCharCode((65 + i));
        // 对应码取消了11的倍数,比如11,22,33,所以我们要排除掉
        if (num === 11 || num === 22 || num === 33) {
            num += 1;
        }
        getNumber.set(word, num);
        num += 1;
    }
    let sum = 0;
    // 取四个字母对应的数字,并进行计算
    for (let i = 0; i < 4; i++) {
        sum += getNumber.get(value[i]) * Math.pow(2, i);
    }
    // 对前6个数字进行计算
    for (let i = 4; i < 10; i++) {
        sum += value[i] * Math.pow(2, i);
    }
    console.log(sum);
    // 再对10取余是防止出现校验码为10的情况,假如校验码为10,则取0
    checkDigit = sum % 11 % 10;
    // 判断校验码是否与最后一位数字相等
    if (checkDigit === Number(value[10])) {
        console.log('校验通过')
        return true;
    } else {
        console.log('校验失败')
        return false;
    }

};
const num = 'CBHU3202732';
check(num)
let check = function (value) {
    let getNumber = new Map();
    let num = 10;
    // 生成字母与数字对照表
    for (let i = 0; i < 26; i++) {
        let word = String.fromCharCode((65 + i));
        // 对应码取消了11的倍数,比如11,22,33,所以我们要排除掉
        if (num === 11 || num === 22 || num === 33) {
            num += 1;
        }
        getNumber.set(word, num);
        num += 1;
    }
    let sum = 0;
    // 取四个字母对应的数字,并进行计算
    for (let i = 0; i < 4; i++) {
        sum += getNumber.get(value[i]) * Math.pow(2, i);
    }
    // 对前6个数字进行计算
    for (let i = 4; i < 10; i++) {
        sum += value[i] * Math.pow(2, i);
    }
    console.log(sum);
    // 再对10取余是防止出现校验码为10的情况,假如校验码为10,则取0
    checkDigit = sum % 11 % 10;
    // 判断校验码是否与最后一位数字相等
    if (checkDigit === Number(value[10])) {
        console.log('校验通过')
        return true;
    } else {
        console.log('校验失败')
        return false;
    }

};
const num = 'CBHU3202732';
check(num)

编辑于 2019-01-22