C# Basic validate container number

Date: 2022-08-23
// ISO 6346

// does NOT validate the "Check Digit"

private static Regex containerNumberRegex = new Regex("^[a-zA-Z]{3}[uUjJzZ]{1}[0-9]{7}$");
public static bool IsValidContainerNumber(string text) => containerNumberRegex.IsMatch(text);


IsValidContainerNumber(" MEDU8707688  ".Trim())



//////////////////////////////
// Code to get Check digit
//////////////////////////////

private static string CharacterValues = "0123456789A_BCDEFGHIJK_LMNOPQRSTU_VWXYZ"; // skip 11th values

// short Linq version
private static int GetCheckDigit(string containerNumber) 
{
    var sum = containerNumber.Select((c, i) => CharacterValues.IndexOf(c) * Math.Pow(2, i)).Sum();
    return (int)(sum - (Math.Floor(sum / 11.0) * 11.0));
}

// comprehensive version
private static int GetCheckDigit(string containerNumber) 
{
    var sum = 0.0;
    for (int i = 0; i < containerNumber.Count(); i++)
    {
        char c = containerNumber[i];
        var power = Math.Pow(2, i);
		var charValue = CharacterValues.IndexOf(c);
		Console.WriteLine($"{i}: [{c}] {power,4} * {charValue,4} = {power*charValue,4}");
        sum += CharacterValues.IndexOf(c) * power;
    }
    var rest =  Math.Floor(sum / 11.0) * 11.0;
	Console.WriteLine($"sum-rest: {sum} - {rest} = {sum - rest}");
    return (int)Math.Floor(sum - rest);
}

void Main()
{
	Console.WriteLine(GetCheckDigit("CSQU305438"));
}


/* OUTPUT:
0: [C]    1 *   13 =   13
1: [S]    2 *   30 =   60
2: [Q]    4 *   28 =  112
3: [U]    8 *   32 =  256
4: [3]   16 *    3 =   48
5: [0]   32 *    0 =    0
6: [5]   64 *    5 =  320
7: [4]  128 *    4 =  512
8: [3]  256 *    3 =  768
9: [8]  512 *    8 = 4096
sum-rest: 6185 - 6182 = 3
3
*/

What is ISO 6346 (wikipedia definition)

ISO 6346 is an international standard covering the coding, identification and marking of intermodal (shipping) containers used within containerized intermodal freight transport.The standard establishes a visual identification system for every container that includes a unique serial number (with check digit), the owner, a country code, a size, type and equipment category as well as any operational marks. The standard is managed by the International Container Bureau (BIC).

preview image
StepContainer numberTotal
C S Q U 3 0 5 4 3 8
113 30 28 32 3 0 5 4 3 8
x x x x x x x x x x
21 2 4 8 16 32 64 128 256 512
= = = = = = = = = =
13 60 112 256 48 0 320 512 768 4096
3Sum all results from (2)6185
4Divide (3) by 11 (remainder discarded)562
5Multiply (4) by 116182
6(3) minus (5) = Check Digit:3

Step 1

An equivalent numerical value is assigned to each letter of the alphabet, beginning with 10 for the letter A (11 and multiples thereof are omitted):

0123456789
0123456789
ABCDEFGHIJKLM
10121314151617181920212324
NOPQRSTUVWXYZ
25262728293031323435363738

Step 2

Each of the numbers calculated in step 1 is multiplied by 2position, where position is the exponent to base 2. Position starts at 0, from left to right.

Step 3

Sum up all results of Step above

Step 4

Round the result down towards zero i.e. make the result a whole number (integer)

Step 5

Divide them by 11

Step 6

Multiply the integer value by 11

Step 7

Subtract result of Step 3 from result of (6): This is the check digit.

66020cookie-checkC# Basic validate container number