js集装箱号校验算法
集装箱号校验算法
集装箱号通常由11位字符组成,包括4位字母(前三位为箱主代码,第四位为设备识别码U/J/Z)、6位数字和1位校验码。校验算法基于ISO 6346标准,具体步骤如下:
计算字母对应值
将前4位字母转换为数字,转换规则为:A=10,B=12,C=13,...,K=21,L=23,...,Z=38(跳过11、22、33等重复数字)。每个字母对应值乘以2的(位置索引-1)次方。
字母位置索引从0开始计算:
- 第1位字母:值 × 1 (2⁰)
- 第2位字母:值 × 2 (2¹)
- 第3位字母:值 × 4 (2²)
- 第4位字母:值 × 8 (2³)
计算数字部分值
中间6位数字直接拼接为数字,每位数字乘以2的(位置索引+4)次方(因字母部分已占用前4位)。
校验码计算
- 将字母和数字部分的所有乘积相加得到总和
- 总和除以11取余数
- 余数为10时校验码为0,否则校验码即为余数本身
JavaScript实现代码
function validateContainerNumber(containerNum) {if (!/^[A-Z]{4}\d{6}\d$/.test(containerNum)) {return false; // 基本格式校验}const charMap = {'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};let sum = 0;// 处理字母部分for (let i = 0; i < 4; i++) {const char = containerNum.charAt(i);sum += charMap[char] * Math.pow(2, i);}// 处理数字部分for (let i = 4; i < 10; i++) {const digit = parseInt(containerNum.charAt(i), 10);sum += digit * Math.pow(2, i);}// 计算校验码const checkDigit = sum % 11;const actualCheckDigit = checkDigit === 10 ? 0 : checkDigit;return actualCheckDigit === parseInt(containerNum.charAt(10), 10);
}
使用示例
console.log(validateContainerNumber("TEXU1234562")); // 返回true
console.log(validateContainerNumber("APZU1234563")); // 返回false
注意事项
- 输入字符串必须为11位,前4位字母后7位数字
- 第四位字母通常为U(常规集装箱)、J(可拆卸设备)或Z(拖车)
- 实际应用中建议先去除空格和连字符等分隔符
- 该方法不验证箱主代码是否真实存在,仅校验格式和计算规则
该算法广泛应用于物流、货运和海关系统中,确保集装箱编号的有效性。