如何计算GTIN中的可变重量/价格校验数字



GS1标准定义了包含4或5位可变权重或价格的GTIN代码。此可变重量或价格部件需要使用校验数字进行验证。

我如何计算代码中的校验位?请注意,此校验位的计算方式与GTIN末尾的默认校验位不同。

供参考:https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf第466页/467

您没有指定所选的语言,所以希望这对您有用。从本质上讲,它可以归结为数组查找和简单的数学运算。这段代码是用AutoITScript编写的,但翻译成其他代码应该很简单。

我确信这段代码可以变得更智能(使用2d数组查找、函数等(,但为了简单起见,我让它更可读。

需要注意的是,AutoIT不是一种类型化语言,因此1234可以被视为数字和字符串。此外,AutoIT使用$var[index1][index2]来访问基于0的数组值。

希望这对你有所帮助!如果是,请接受解决方案。

结果

============= barcode checksum variable length ================
https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf section 7.9.2
----------------------
Doing checksum on 4 digits: 2875
digit 1 is: 2 --> Check = 4
digit 2 is: 8 --> Check = 5
digit 3 is: 7 --> Check = 1
digit 4 is: 5 --> Check = 3
==> Sum is 39
==> CHECK DIGIT IS RIGHT-MOST DIGIT = 9
----------------------
Doing checksum on 5 digits: 14685
digit 1 is: 1 --> Check = 5
digit 2 is: 4 --> Check = 8
digit 3 is: 6 --> Check = 7
digit 4 is: 8 --> Check = 4
digit 5 is: 5 --> Check = 9
==> Sum is 33
==> CHECK DIGIT IS 40-sum =  7

代码

#include <String.au3>
; barcode checksum
; https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf section 7.9.2
;
ConsoleWrite("============= barcode checksum variable length ================" & @CRLF)
ConsoleWrite("https://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf section 7.9.2" & @CRLF)
;                      index 0              index 1                index 2                index 3
;                     --- wf2- ----------   ---  wf3 -----------   --- wf5+  ----------   ---- wf5- ----------
Static $f[4][10] = [ [0,2,4,6,8,9,1,3,5,7], [0,3,6,9,2,5,8,1,4,7], [0,5,1,6,2,7,3,8,4,9], [0,5,9,4,8,3,7,2,6,1]   ]
;                              4 digit version   5 digit version
static $lookupTables[2][5] =[  [ 0, 0, 1, 3] ,  [ 2, 0, 3, 2, 0] ]
; ==================================
; show some examples
_calcit(2875)
_calcit(14685)

; -------------------- function to calculate digits
;
Func _calcit($thenumber)
; assume the length is correct here
; theNumber is now array [0] is left-most
local $arrayNumber = _StringExplode($thenumber, "", 0)
local $t  ; our lookup digit
local $tSum ; summarized
local $theversion = 0   ; 0 = 4 digit, 1 = 5 digits
if StringLen($thenumber) = 4 then
$theversion = 0
else
$theversion = 1
endif
ConsoleWrite("----------------------" & @CRLF)
ConsoleWrite("Doing checksum on " & StringLen($thenumber) &  " digits: " & $thenumber & @CRLF)
for $i = 0 to StringLen($thenumber)-1
ConsoleWrite("digit " & $i+1 & " is: " & $arrayNumber[$i])
;lookup the number in our 2d array. Which row determined by the lookup table.
$t = $f [$lookupTables[$theversion][$i]] [$arrayNumber[$i] ]
ConsoleWrite(" --> Check = " & $t & @CRLF)
$tSum = $tSum + $t
Next
if $theversion = 0 then
$tSum = $tSum * 3
ConsoleWrite(" ==> Sum is " & $tSum & @CRLF)
ConsoleWrite(" ==> CHECK DIGIT IS RIGHT-MOST DIGIT = " & StringRight($tSum, 1) & @CRLF)
else
ConsoleWrite(" ==> Sum is " & $tSum & @CRLF)
$tSum = 40-$tSum
ConsoleWrite(" ==> CHECK DIGIT IS 40-sum =  " & StringRight($tSum, 1) & @CRLF)
EndIf
EndFunc

相关内容

  • 没有找到相关文章

最新更新