【问题标题】:How to calculate checksum digit for EAN-14?如何计算 EAN-14 的校验和数字?
【发布时间】:2016-12-08 15:42:13
【问题描述】:

我正在尝试在 vba 访问中验证 EAN 14 UPC 代码。我试图在网上找到它,但没有运气。我刚刚找到了 EAN 8 和 EAN 13。所以,我只是尝试将其编码为类似于 EAN 13,如下所示:

If Len(Barcode) = 14 Then
    'do the check digit for EAN 14 for anything 14 long
    checkDigitSubtotal = (Val(Mid(Barcode, 2, 1))) _
                            + (Val(Mid(Barcode, 4, 1))) _
                            + (Val(Mid(Barcode, 6, 1))) _
                            + (Val(Mid(Barcode, 8, 1))) _
                            + (Val(Mid(Barcode, 10, 1))) _
                            + (Val(Mid(Barcode, 12, 1)))
        checkDigitSubtotal = (3 * checkDigitSubtotal) _
                            + (Val(Mid(Barcode, 1, 1))) _
                            + (Val(Mid(Barcode, 3, 1))) _
                            + (Val(Mid(Barcode, 5, 1))) _
                            + (Val(Mid(Barcode, 7, 1))) _
                            + (Val(Mid(Barcode, 9, 1))) _
                            + (Val(Mid(Barcode, 11, 1))) _
                            + (Val(Mid(Barcode, 13, 1)))

    If Right(Str(300 - checkDigitSubtotal), 1) <> Right(Barcode, 1) Then
        Validate_UPC = "EAN14-BAD"
        Exit Function
    End If
        Validate_UPC = "EAN14-GOOD"
        Exit Function
    End If

它不工作。我遇到的问题是虽然我输入了有效的 EAN,但它给了我 EAN14-BAD。我认为我的验证代码不起作用。我刚刚添加了最后一行 + (Val(Mid(Barcode, 13, 1))) 关于 EAN13 验证码。请帮忙。

【问题讨论】:

  • 不应将第一个小计乘以 3。而应将第二个小计乘以 3,即奇数位的数字。
  • @Codo:仅适用于 EAN-14 吗?因为当我像上面显示的那样编码时它适用于 EAN-8 和 EAN-13?
  • GS1 解释了如何calculate a check digit。如果您从第一个数字到倒数第二个数字,它会改变偶数或奇数数字是否乘以 3。如果您向后工作,它在不同的 EAN 代码长度之间更加一致。

标签: ms-access vba check-digit ean-13


【解决方案1】:

当我将奇数乘以 3 时,它起作用了:

 If Len(Barcode) = 14 Then       
    checkDigitSubtotal = (Val(Mid(Barcode, 1, 1))) _
                            + (Val(Mid(Barcode, 3, 1))) _
                            + (Val(Mid(Barcode, 5, 1))) _
                            + (Val(Mid(Barcode, 7, 1))) _
                            + (Val(Mid(Barcode, 9, 1))) _
                            + (Val(Mid(Barcode, 11, 1))) _
                            + (Val(Mid(Barcode, 13, 1)))
        checkDigitSubtotal = (3 * checkDigitSubtotal) _
                            + (Val(Mid(Barcode, 2, 1))) _
                            + (Val(Mid(Barcode, 4, 1))) _
                            + (Val(Mid(Barcode, 6, 1))) _
                            + (Val(Mid(Barcode, 8, 1))) _
                            + (Val(Mid(Barcode, 10, 1))) _
                            + (Val(Mid(Barcode, 12, 1)))

    If Right(Str(300 - checkDigitSubtotal), 1) <> Right(Barcode, 1) Then
        Validate_UPC = "EAN14-BAD"
        Exit Function
    End If
        Validate_UPC = "EAN14-GOOD"
        Exit Function
    End If

【讨论】:

    【解决方案2】:

    你试过 8 个字符吗?

    If Len(Barcode) = 8 Then
        'do the check digit for EAN 8 for anything 8 long
        checkDigitSubtotal = (Val(Mid(Barcode, 2, 1))) _
                                + (Val(Mid(Barcode, 4, 1))) _
                                + (Val(Mid(Barcode, 6, 1))) 
            checkDigitSubtotal = (3 * checkDigitSubtotal) _
                                + (Val(Mid(Barcode, 1, 1))) _
                                + (Val(Mid(Barcode, 3, 1))) _
                                + (Val(Mid(Barcode, 5, 1))) _
                                + (Val(Mid(Barcode, 7, 1))) 
    
        If Right(Str(300 - checkDigitSubtotal), 1) <> Right(Barcode, 1) Then
            Validate_UPC = "EAN8-BAD"
            Exit Function
        End If
        Validate_UPC = "EAN8-GOOD"
        Exit Function
    End If
    

    【讨论】:

    • 我尝试了 EAN 13,我认为它正在工作。我只是不知道 EAN-14。
    【解决方案3】:

    VB.NET 中的 EAN8 和 EAN13

      Public Function generateEAN(ByVal barcode As String, EsEan8 As Boolean) As String
    
        Dim first As Integer = 0
        Dim second As Integer = 0
        If EsEan8 Then
            barcode = Right(("00000000" & barcode), 7)
        Else
            barcode = Right(("000000000000" & barcode), 12)
        End If
    
        If barcode.Length() = 7 OrElse barcode.Length() = 12 Then
    
            For counter As Integer = 0 To barcode.Length() - 1 Step 2
                first = (first + barcode.Substring(counter, 1))
    
                If counter + 1 < barcode.Length Then
                    second = (second + barcode.Substring(counter + 1, 1))
                End If
    
            Next
            If EsEan8 Then
                first = first * 3
            Else
                second = second * 3
            End If
    
            Dim total As Integer = second + first
            Dim roundedNum As Integer = (10 - (total Mod 10)) Mod 10
            barcode = barcode & roundedNum
    
        End If
        Return barcode
    
    
    
    End Function
    

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2017-04-07
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多