首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种计算18位SSCC GS1码校验位的算法

一种计算18位SSCC GS1码校验位的算法
EN

Code Review用户
提问于 2016-11-04 12:34:18
回答 2查看 3.9K关注 0票数 1

我在计算GS1的18位条形码。第18位数字是一个校验数字,用于验证该代码的其余部分并检查它是否正确。检查数字是介于0-9之间的一个数字,并使用前面17位数字上的特定算法计算,该算法是该代码的输入。您可以在以下网站找到更多信息:http://www.morovia.com/kb/Serial-Shipping-Container-Code-SSCC18-10601.html

代码语言:javascript
复制
static int getCheckDigit(string SSCC)
{
    int[] SSCCArray = SSCC.ToCharArray().Select(c => (int)char.GetNumericValue(c)).ToArray();

    int position = 0;
    int oddPisitonsSUM = 0;
    int evenPositionsSUM = 0;
    int oddSumMultiply3;
    int totalSUM;
    int mod10Remainder;
    int CheckDigit;

    foreach (int i in SSCCArray)
    {
        position += 1;

        if (position % 2 == 0)
        {
            evenPositionsSUM += i;
        }
        else
        {
            oddPisitonsSUM += i;
        }
    }
    oddSumMultiply3 = oddPisitonsSUM * 3;
    totalSUM = oddSumMultiply3 + evenPositionsSUM;
    mod10Remainder = totalSUM % 10;

    if (mod10Remainder == 0)
    {
        return mod10Remainder;
    }
    else
    {
        CheckDigit = (10 - mod10Remainder);
        return CheckDigit;
    }
}

毫无疑问,有一个更优雅的解决方案,但这是我第一次破解它。欢迎所有建设性的批评。

EN

回答 2

Code Review用户

发布于 2016-11-04 13:18:10

首先,迭代输入字符串两次:第一次在将字符串转换为int[] SSCCArray时,第二次在遍历数组时。

接下来,您不需要知道数组(或字符串)中的位置本身,只需要知道该位置是奇数还是偶数。这可以通过bool变量来实现。

接下来,输入字符串有哪些无效字符?处理这个案子是有道理的。

我的建议:

代码语言:javascript
复制
private static int getCheckDigit(string sscc)
{
    int oddPisitonsSum = 0;
    int evenPositionsSum = 0;

    bool evenPosition = false;

    foreach (char c in sscc)
    {
        int i = (int)char.GetNumericValue(c);
        if (i < 0)
        {
            // Invalid char detected
            continue; // or throw an exception
        }

        if (evenPosition)
        {
            evenPositionsSum += i;
        }
        else
        {
            oddPisitonsSum += i;
        }
        evenPosition = !evenPosition; // Toggle the flag
    }
    int totalSum = oddPisitonsSum * 3 + evenPositionsSum;
    int mod10Remainder = totalSum % 10;

    return mod10Remainder == 0 ? mod10Remainder : 10 - mod10Remainder;
}
票数 2
EN

Code Review用户

发布于 2016-11-04 18:54:36

我想你可以把它减少

代码语言:javascript
复制
int sum = 0;
for(int i = 0; i < SSCC.Length; i++)
{
    int charValue = (int)char.GetNumericValue(SSCC[i]);
    if (charValue < 0)
    {
        continue;
    }
    if (i % 2 == 0)
    {
        sum += charValue;
    }
    else
    {
        sum += charValue * 3;
    }
}
return sum % 10 == 0 ? 0 : 10 - sum % 10;
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/146122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档