What is the algorithm for converting a zero-suppressed, eight-digit GTIN-12 identifier (represented as a UPC-E barcode) into the full, twelve-digit version as shown in a UPC
The algorithm for converting a GTIN-12 identifier between UPC-E and UPC-A representation can be most clearly seen from the following pattern mapping:
SabcdeNX ⟺ SabN0000cdeX : 0≤N≤2
Sabcde3X ⟺ Sabc00000deX
Sabcde4X ⟺ Sabcd00000eX
SabcdeNX ⟺ Sabcde0000NX : 5≤N≤9
In the above S
is the number system (either 0 or 1) and X
is the check digit.
In pseudo-code it looks like this:
Input: A valid eight-digit UPC-E: Assigned to E[].
Output: PASS: Twelve-digit UPC-A representing the UPC-E.
FAIL: Reason.
if E[0] != {0-1} then FAIL: Invalid number system.
if E[6] == {0-2} then PASS: E[0..2] . E[6] . "0000" . E[3..5] . E[7]
if E[6] == "3" then PASS: E[0..3] . "00000" . E[4..5] . E[7]
if E[6] == "4" then PASS: E[0..4] . "00000" . E[5] . E[7]
if E[6] == {5-9} then PASS: E[0..5] . "0000" . E[6] . E[7]
This duplicates the algorithm in @Terry Burton's answer, written in Java.
switch (data.charAt(6)) {
case '0':
case '1':
case '2': {
data = data.substring(0, 3) + "0000" + data.charAt(6) + data.substring(3, 6) + data.charAt(7);
break;
}
case '3': {
data = data.substring(0, 4) + "00000" + data.substring(4, 5) + data.charAt(7);
break;
}
case '4': {
data = data.substring(0, 5) + "00000" + data.charAt(5) + data.charAt(7);
break;
}
case '5':
case '6':
case '7':
case '8':
case '9': {
data = data.substring(0, 6) + "0000" + data.charAt(6) + data.charAt(7);
break;
}
}