EAN-13符号被编码前,软件必须计算出正确的校验码位,校验码位也将出现在条码中。校验码位是数制、厂商码和产品码的每个数位的数值的加权和对10取模得到的。In simple English,那意味着我们必须为条码计算校验码值。首先,我们取出值得最右边一个数位并将它作为一个“奇数”字符。然后,我们从右向左移动,交替出现奇数和偶数。接下来,我们将所有偶数位置上的数值求和,将所有奇数位置上的数值乘以3后求和。
计算校验位的步骤如下:
1. 将最右边一个数位作为“奇数”位,从右向左为每个字符指定奇数/偶数位。
2. 对所有奇数位上的数值求和,将结构乘以3。
3. 对所有偶数位上的数值求和。
4. 对第2步和第3步计算的结果求和。
5. 校验位的数字加上用第4步计算的总和数应该能够被10整除。
6. 如果第4步计算的总和数能够被10整除,校验位就是“ 0” (不是10)
通过一个例子可以很容易理解。我们要计算条码0075678164125的校验码位。事实上,我们知道这个条码的最右一位数字“5”就是校验码位。这就是说这个条码自身的“信息”实际上是007567816412(我们是把条码的最后一个字符去掉了的)。其中,“00”是数制,“75678”是厂商码,“16412”是产品码。因此,我们必须为消息007567816412计算一个校验位
为每个数位计算加权和,我们可以得到0+0+7+15+6+21+8+3+6+12+1+6=85。这就是校验码值。然而,只有一个校验码位。校验位的值必须能够使得校验码的值加上校验位的值能够被10整除。在这种情况下,在85之后能被10整除的数字是90。我们需要给85加上5才能得到90,因此,我们的校验位就是“5”。我们为原来的条码消息(007567816412)追加校验码位(5),就得到了最终的0075678164125。
将这个最终得到的条码和我们原来的条码比较,我们发现我们计算出来的校验码位事实上和原来条码上的校验码位是相同的。因此,我们的计算是正确的。
Note:可能你要问在EAN-13符号中,为什么第一个字符被作为了“偶数”位而第二个字符被作为了“奇数”位。逻辑上认为第一个字符应该被作为“奇数”而第二个字符应该被作为“偶数”。别担心,这里面有个合理的解释。
这样做是为了保持和原来UPC-A格式的兼容性。原来的UPC-A符号仅有单一的一位数值,因此,EAN-13符号中的第二个字符就应该是UPC-A符号中的第一个字符,因此,也就成了“奇数”位。为了不改写和混淆规范,当定义EAN-13标准的时候,他们只是在前面插入了这个新的前导字符并将它称为“偶数”位,这样就和现有的UPC-A条码保持了兼容性,在某种程度上,也兼容了现有的UPC-A的文档
计算方法:
If IsNumeric(Mid(Trim(Text2(1).text), 1, 4)) = True Then
txm = Format(Mid(Trim(Text2(1).text), 1, 4), "0000") '货号四位
Else
txm = Format(Mid(Trim(Text2(0).text), 5, 4), "0000") '编号四位
End If
txm = txm & Format(Mid(Year(Date), 4, 1), "0") '年末位
txm = txm & Format(Month(Date), "00") '月两位
txm = txm & Format(Day(Date), "00") '日两位
txm = txm & Format(CInt(Text2(4).text), "000") '基准价三位
' 计算效验码 EAN-13 规则
Num = 0
For i = 1 To 11 Step 2
Num = Num + CInt(Mid(txm, i, 1))
Next i
For i = 2 To 12 Step 2
Num = Num + CInt(Mid(txm, i, 1)) * 3
Next i
Text1.text = txm & (10 - Num Mod 10)