如何将UPC-A转换为UPC-E?

我们想把12位的UPC-A转换成8位的UPC-E。 你能告诉我哪个是最好的方法来做到这一点,而不必使用我自己的代码转换?

我有很多公式将8位UCC-E转换为12位UPC-A,但不能反转。

NSString *strScannedCode = @"028200002921"; NSString *strBarCodeType = @"UPC E"; NSString *strAlteredScannedCode = strScannedCode; if ([strBarCodeType isEqualToString:@"UPC E"]) { if (strScannedCode.length == 12) { NSString *strManufacturerCode = [strScannedCode substringWithRange:(NSMakeRange(1, 5))]; NSString *strProductCode = [strScannedCode substringWithRange:NSMakeRange(6, 5)]; NSLog(@"strManufacturerCode = %@",strManufacturerCode); NSLog(@"strProductCode = %@",strProductCode); if ([[strManufacturerCode substringWithRange:NSMakeRange(2, 3)] isEqualToString:@"000"] || [[strManufacturerCode substringWithRange:NSMakeRange(2, 3)] isEqualToString:@"100"] || [[strManufacturerCode substringWithRange:NSMakeRange(2, 3)] isEqualToString:@"200"]) { strAlteredScannedCode = STRING(@"%@%@%@",[strManufacturerCode substringWithRange:NSMakeRange(0, 2)], [strProductCode substringWithRange:NSMakeRange(2, 3)], [strManufacturerCode substringWithRange:NSMakeRange(2, 1)]); } else if ([[strManufacturerCode substringWithRange:NSMakeRange(3, 2)] isEqualToString:@"00"]) { strAlteredScannedCode = STRING(@"%@%@3",[strManufacturerCode substringWithRange:NSMakeRange(0, 3)], [strProductCode substringWithRange:NSMakeRange(3, 2)]); } else if ([strManufacturerCode characterAtIndex:4] == '0') { strAlteredScannedCode = STRING(@"%@%@4",[strManufacturerCode substringWithRange:NSMakeRange(0, 4)], [strProductCode substringWithRange:NSMakeRange(4, 1)]); } else if ([strManufacturerCode characterAtIndex:4] != '0') { strAlteredScannedCode = STRING(@"%@%@",strManufacturerCode, [strProductCode substringWithRange:NSMakeRange(4, 1)]); } strAlteredScannedCode = STRING(@"%@%@%@",[strScannedCode substringWithRange:NSMakeRange(0, 1)],strAlteredScannedCode,[strScannedCode substringWithRange:NSMakeRange(11, 1)]); NSLog(@"strUPC_E_Code = %@",strAlteredScannedCode); } } 

通过执行上面的代码,你会得到12位数字到8位数字,例如你会得到结果为“02829221”,这是UPC E的“028200002921”。

在UPC-A和UPC-E表示之间转换GTIN-12标识符的algorithm可从以下模式映射中清楚地看出:

 SabN0000cdeX ⟺ SabcdeNX : 0≤N≤2 Sabc00000deX ⟺ Sabcde3X Sabcd00000eX ⟺ Sabcde4X Sabcde0000NX ⟺ SabcdeNX : 5≤N≤9 

在上面的S是数字系统,0或1, X是校验位。 如果UPC-A与模式不匹配,则不能将其转换为UPC-E。

可以看出,每个UPC-A最多可以有四个有效的UPC-E表示:

001200000067⟺00100627⟺00120637⟺00120647⟺00120067。

执行从UPC-A到UPC-E的一种转换方法的伪代码如下所示:

 Input: A valid twelve-digit UPC-A: Assigned to A[]. Output: PASS: Eight-digit UPC-E representing the UPC-A. FAIL: Reason. if A[0] != {0-1} then FAIL: Invalid number system. if A[3] == {0-2} && A[4-7] == "0000" then PASS: A[0-2] . A[8-10] . A[3] . A[11] if A[4-8] == "00000" then PASS: A[0-3] . A[9-10] . "3" . A[11] if A[5-9] == "00000" then PASS: A[0-4] . A[10] . "4" . A[11] if A[6-9] == "0000" && A[10] == {5-9} then PASS: A[0-5] . A[10] . A[11] FAIL: UPC-A not compatible with UPC-E.