根据ISO 6346计算校验位的方法

huangapple go评论77阅读模式
英文:

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, &#39;&#39;);

  // Check if length fits requirements.
  if (csc.length &lt; 10 || csc.length &gt; 11)
    return NaN;

  // Calculate check digit.
  var sum = 0;
  for (let i = 0; i &lt; 10; i++) {

    // Map letters to numbers.
    let n = csc.charCodeAt(i);
    n -= n &lt; 58 ? 48 : 55;

    // Numbers 11, 22, 33 are omitted.
    n += (n-1) / 10;

    // Sum of all numbers multiplied by weighting.
    sum += n &lt;&lt; i;
  }

  // Modulus of 11, and map 10 to 0.
  return sum % 11 % 10;
}

console.log(iso6346CheckDigit(&#39;ZEPU 003725 [5]&#39;)); // 5
console.log(iso6346CheckDigit(&#39;GVTU 300038 [9]&#39;)); // 9
console.log(iso6346CheckDigit(&#39;TEXU 307007 [9]&#39;)); // 9
console.log(iso6346CheckDigit(&#39;GABU 307007 [0]&#39;)); // 0
console.log(iso6346CheckDigit(&#39;BAAD 10000.....&#39;)); // 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, &#39;&#39;);

  // Check if length fits requirements.
  if (csc.length &lt; 10 || csc.length &gt; 11)
    return NaN;

  return Array(10).fill().map((_, i) =&gt; csc.charCodeAt(i))
    .map(a =&gt; a -= a &lt; 58 ? 48 : 55)
    .map(a =&gt; a + (a-1) / 10)
    .map((a, i) =&gt; a &lt;&lt; i)
    .reduce((a, b) =&gt; a + b) % 11 % 10;
}

console.log(iso6346CheckDigit(&#39;ZEPU 003725 [5]&#39;)); // 5
console.log(iso6346CheckDigit(&#39;CEBU 100107 [5]&#39;)); // 5
console.log(iso6346CheckDigit(&#39;TEXU 307007 [9]&#39;)); // 9
console.log(iso6346CheckDigit(&#39;ABCD 123456 [0]&#39;)); // 0

<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年5月23日 00:21:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/76308164.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定