将零抑制的八位GTIN-12标识符(表示为UPC-E条形码)转换为完整的十二位数版本的算法是什么,如UPC-A条形码所示?
有没有办法在不编写代码的情况下为少量条形码实现这一目标?
答案 0 :(得分:10)
从以下模式映射中可以最清楚地看到用于在UPC-E和UPC-A表示之间转换GTIN-12标识符的算法:
SabcdeNX ⟺ SabN0000cdeX : 0≤N≤2
Sabcde3X ⟺ Sabc00000deX
Sabcde4X ⟺ Sabcd00000eX
SabcdeNX ⟺ Sabcde0000NX : 5≤N≤9
在上面S
是数字系统(0或1),X
是校验位。
在伪代码中,它看起来像这样:
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]
答案 1 :(得分:1)
这与用Java编写的@Terry Burton的答案中的算法重复。
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;
}
}