ISO 6346 là một chuẩn quốc tế quy định để mỗi số Container là duy nhất.
Chuẩn này được quy định và quản lý bởi International Container Bureau (BIC)
Ví dụ về một số Container đúng chuẩn ISO 6346
Trong đó:
Ví dụ: Ta có số Cont: CSQU3054383
Ta sẽ tách 10 ký tự đầu: CSQU305438 để tính toán => số Check Digit
Nếu số Check Digit = 3 + đúng chuẩn ISO 6346.
Các chữ cái tương ứng với các con số trong bảng sau:
A | B | C | D | E | F | G | H | I | J | K | L | M |
10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 |
N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 37 | 38 |
C | S | Q | U | 3 | 0 | 5 | 4 | 3 | 8 | Calc. | |
---|---|---|---|---|---|---|---|---|---|---|---|
13 | 30 | 28 | 32 | 3 | 0 | 5 | 4 | 3 | 8 | ||
× | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | |
13 | 60 | 112 | 256 | 48 | 0 | 320 | 512 | 768 | 4096 | 6185 [a] | |
[b] Chia cho 11: | 562,272... | ||||||||||
[c] Làm tròn: | 562 | ||||||||||
[d] Nhân với 11: | 6182 | ||||||||||
[a] trừ [d] = Check Digit: | 3 |
Như vậy trong ví dụ trên số Cont: CSQU305438 sẽ có Check Digit = 3
Function ISO6346Check(k As String) ' Calculates the ISO Shipping Container Check Digit
Dim i%, s&
Application.Volatile
For i = 1 To 10
s = s + IIf(i < 5, Fix(11 * (Asc(Mid(k, i)) - 56) / 10) + 1, Asc(Mid(k, i)) - 48) * 2 ^ (i - 1)
Next i
ISO6346Check = (s - Fix(s / 11) * 11) Mod 10
End Function
function ISO6346Check(con) {
if (!con || con == "" || con.length != 11) { return false; }
con = con.toUpperCase();
var re = /^[A-Z]{4}\d{7}/;
if (re.test(con)) {
var sum = 0;
for (i = 0; i < 10; i++) {
var n = con.substr(i, 1);
if (i < 4) {
n = "0123456789A?BCDEFGHIJK?LMNOPQRSTU?VWXYZ".indexOf(con.substr(i, 1));
}
n *= Math.pow(2, i); //2的i次方
sum += n;
}
if (con.substr(0, 4) == "HLCU") {
sum -= 2;
}
sum %= 11;
sum %= 10; //余数为10的取0
return sum == con.substr(10);
} else {
return false; //不匹配正则表达式
}
}
function checkDigit($mark){
$char2num = ['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];
$acc=0;
$num=str_split($mark);
for($i=0;$i<10;$i++){
if($i<4) $acc+=($char2num[$num[$i]]*pow(2,$i));
else $acc+=$num[$i]*pow(2,$i);
}
$rem = $acc % 11;
if ($rem == 10) $rem = 0;
if(strlen($mark)==11 && $num[10]==$rem) return true;
return false;
}