从EAN-13条码计算GTIN的库

时间:2018-09-10 11:10:15

标签: c# xml barcode

我正在从应该被送入GDSN数据池的后端创建XML。该公司的后端很旧,每个项目都只有自己的PLU编号和条形码。我所知道的是(至少在冰岛是这样),大多数GTIN是EAN-13条码,前面带有填充0,尽管并非总是如此。您是否知道可以检查GTIN是否正确(即会计算校验位)的库?

我正在使用Windows窗体,并且正在使用C#。

2 个答案:

答案 0 :(得分:0)

首先验证您要执行的操作: https://www.gs1.org/services/check-digit-calculator

那么GTIN的长度必须为14位数字,因此您有2种可能。

  • 您描述的情况,然后在左侧填充0
  • 直接提供长度正确的GTIN(可能的,并且左位数不为0)

根据您知道gtin字符串仅包含数字的事实,这是一个有关如何检查此内容的简单示例:

    public Boolean ValidateGTIN(string gtin)
    {
        string tmpGTIN = gtin;
        if (tmpGTIN.Length < 13)
        {
            Console.Write("GTIN code is invalid (should be at least 13 digits long)");
            return false;
        }
        else if (tmpGTIN.Length == 13)
        {
            tmpGTIN = "0" + gtin;
        }
        // Now that you have a GTIN with 14 digits, you can check the checksum
        Boolean IsValid = false;
        int Sum = 0;
        int EvenSum = 0;
        int CurrentDigit = 0;
        for (int pos = 0; pos <= 12; ++pos)
        {                
            Int32.TryParse(tmpGTIN[pos].ToString(), out CurrentDigit);
            if (pos % 2 == 0)
            {                    
                EvenSum += CurrentDigit;
            }                    
            else
            {
                Sum += CurrentDigit;
            }                    
        }
        Sum += 3 * EvenSum;
        Int32.TryParse(tmpGTIN[13].ToString(), out CurrentDigit);
        IsValid = ((10 - (Sum % 10)) % 10) == CurrentDigit;
        if (!IsValid)
        {
            Console.Write("GTIN code is invalid (wrong checksum)");
        }
        return IsValid;
    }

答案 1 :(得分:0)

谢谢。快到了。我想更进一步-我将复制您的代码并添加一些内容:

//First create a function only for validating
//This is your code to almost all - variable names change  
public Boolean validateGTIN(string gtin)
    {
        Boolean IsValid = false;
        int Sum = 0;
        int EvenSum = 0;
        int CurrentDigit = 0;
        for (int pos = 0; pos <= 12; ++pos)
        {                
            Int32.TryParse(gtin[pos].ToString(), out CurrentDigit);
            if (pos % 2 == 0)
            {                    
                EvenSum += CurrentDigit;
            }                    
            else
            {
                Sum += CurrentDigit;
            }                    
        }
        Sum += 3 * EvenSum;
        Int32.TryParse(GTIN[13].ToString(), out CurrentDigit);
        IsValid = ((10 - (Sum % 10)) % 10) == CurrentDigit;
        if (!IsValid)
        {
            Console.Write("GTIN code is invalid (wrong checksum)");
        }
        return IsValid;
    }
//Here we change quite a bit to accommodate for edge cases:
//We return a string which is the GTIN fully formed or we throw and exception.
public String createGTIN(string bcFromBackend)
    {
        string barcodeStr = bcFromBackend;
//Here we check if the barcode supplied has fewer than 13 digits
        if (barcodeStr.Length < 13)
        {
            throw new System.ArgumentException("Barcode not an EAN-13 
            barcode");
        }
        //If the barcode is of length 13 we start feeding the value with a padded 0 
        //into our validate fuction if it returns false then we pad with 1 and so on
        //until we get to 9. It then throws an error if not valid  
        else if (barcodeStr.Length == 13)
        {
            if(validateGTIN("0"+ barcodeStr))
            {
                 return "0" + barcodeStr;
            } 
            else if(validateGTIN("1" + barcodeStr))
            {
                 return "1" + barcodeStr;
            }
            else if(validateGTIN("2" + barcodeStr))
            {
                 return "2" + barcodeStr;
            }  
            else if(validateGTIN("3" + barcodeStr))
            {
                 return "3" + barcodeStr;
            }
            else if(validateGTIN("4" + barcodeStr))
            {
                 return "4" + barcodeStr;
            }
            else if(validateGTIN("4" + barcodeStr))
            {
                 return "4" + barcodeStr;
            }
            else if(validateGTIN("5" + barcodeStr))
            {
                 return "5" + barcodeStr;
            }
            else if(validateGTIN("6" + barcodeStr))
            {
                 return "6" + barcodeStr;
            }
            else if(validateGTIN("7" + barcodeStr))
            {
                 return "7" + barcodeStr;
            }
            else if(validateGTIN("8" + barcodeStr))
            {
                 return "8" + barcodeStr;
            }
            else if(validateGTIN("9" + barcodeStr))
            {
                 return "9" + barcodeStr;
            } else {
                 throw new System.InvalidOperationException("Unable to create valid 
                 GTIN from given barcode")
            }
        }
        //Lastly if the barcode is of length 14 we try with this value. Else throw 
        //error
        else if(barcodeStr.Length == 14)
        {
            if(validateGTIN(barcodeStr)
            {
                 return barcodeStr;
            }
            else
            {
                 throw new System.InvalidOperationException("Unable to create valid 
                 GTIN from given barcode");
            }
        }

希望这是有道理的。我没有通过测试发送代码,因为我的当前计算机上没有安装IDE。是