英文:
How to calculate the check digit according to ISO 6346
问题
如何实施ISO 6346:2022货柜 — 编码、识别和标记中规定的检查位算法?
请查看货柜检查位是如何计算的?
这是一个自答问题。
英文:
How to implement the check digit algorithm specified in ISO 6346:2022 Freight containers — Coding, identification and marking?
See how is the check digit of a container calculated?
This is a self-answered question.
答案1
得分: 1
这是根据 ISO 6346:2022 计算检验码的代码部分:
function iso6346CheckDigit(csc) {
// 移除任何非字母数字字符并转换为大写。
csc = csc.toUpperCase().replace(/[^A-Z0-9]+/g, '');
// 检查长度是否符合要求。
if (csc.length < 10 || csc.length > 11)
return NaN;
// 计算检验码。
var sum = 0;
for (let i = 0; i < 10; i++) {
// 将字母映射到数字。
let n = csc.charCodeAt(i);
n -= n < 58 ? 48 : 55;
// 忽略数字 11、22、33。
n += (n-1) / 10;
// 所有数字乘以权重后的总和。
sum += n << i;
}
// 模 11,并将 10 映射为 0。
return sum % 11 % 10;
}
console.log(iso6346CheckDigit('ZEPU 003725 [5]')); // 5
console.log(iso6346CheckDigit('GVTU 300038 [9]')); // 9
console.log(iso6346CheckDigit('TEXU 307007 [9]')); // 9
console.log(iso6346CheckDigit('GABU 307007 [0]')); // 0
console.log(iso6346CheckDigit('BAAD 10000.....')); // NaN
以上内容已发布在 GitHub 上。
英文:
This calculates the check digit as per ISO 6346:2022:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function iso6346CheckDigit(csc) {
// Remove any non-alphanumeric characters and convert to upper-case.
csc = csc.toUpperCase().replace(/[^A-Z0-9]+/g, '');
// Check if length fits requirements.
if (csc.length < 10 || csc.length > 11)
return NaN;
// Calculate check digit.
var sum = 0;
for (let i = 0; i < 10; i++) {
// Map letters to numbers.
let n = csc.charCodeAt(i);
n -= n < 58 ? 48 : 55;
// Numbers 11, 22, 33 are omitted.
n += (n-1) / 10;
// Sum of all numbers multiplied by weighting.
sum += n << i;
}
// Modulus of 11, and map 10 to 0.
return sum % 11 % 10;
}
console.log(iso6346CheckDigit('ZEPU 003725 [5]')); // 5
console.log(iso6346CheckDigit('GVTU 300038 [9]')); // 9
console.log(iso6346CheckDigit('TEXU 307007 [9]')); // 9
console.log(iso6346CheckDigit('GABU 307007 [0]')); // 0
console.log(iso6346CheckDigit('BAAD 10000.....')); // NaN
<!-- end snippet -->
The above has been published on GitHub.
答案2
得分: 0
function iso6346CheckDigit(csc) {
csc = csc.toUpperCase().replace(/[^A-Z0-9]+/g, '');
// 检查长度是否符合要求。
if (csc.length < 10 || csc.length > 11)
return NaN;
return Array(10).fill().map((_, i) => csc.charCodeAt(i))
.map(a => a -= a < 58 ? 48 : 55)
.map(a => a + (a-1) / 10)
.map((a, i) => a << i)
.reduce((a, b) => a + b) % 11 % 10;
}
console.log(iso6346CheckDigit('ZEPU 003725 [5]')); // 5
console.log(iso6346CheckDigit('CEBU 100107 [5]')); // 5
console.log(iso6346CheckDigit('TEXU 307007 [9]')); // 9
console.log(iso6346CheckDigit('ABCD 123456 [0]')); // 0
英文:
Alternatively, using map and reduce:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function iso6346CheckDigit(csc) {
csc = csc.toUpperCase().replace(/[^A-Z0-9]+/g, '');
// Check if length fits requirements.
if (csc.length < 10 || csc.length > 11)
return NaN;
return Array(10).fill().map((_, i) => csc.charCodeAt(i))
.map(a => a -= a < 58 ? 48 : 55)
.map(a => a + (a-1) / 10)
.map((a, i) => a << i)
.reduce((a, b) => a + b) % 11 % 10;
}
console.log(iso6346CheckDigit('ZEPU 003725 [5]')); // 5
console.log(iso6346CheckDigit('CEBU 100107 [5]')); // 5
console.log(iso6346CheckDigit('TEXU 307007 [9]')); // 9
console.log(iso6346CheckDigit('ABCD 123456 [0]')); // 0
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论