我在计算GS1的18位条形码。第18位数字是一个校验数字,用于验证该代码的其余部分并检查它是否正确。检查数字是介于0-9之间的一个数字,并使用前面17位数字上的特定算法计算,该算法是该代码的输入。您可以在以下网站找到更多信息:http://www.morovia.com/kb/Serial-Shipping-Container-Code-SSCC18-10601.html
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;
}
}毫无疑问,有一个更优雅的解决方案,但这是我第一次破解它。欢迎所有建设性的批评。
发布于 2016-11-04 13:18:10
首先,迭代输入字符串两次:第一次在将字符串转换为int[] SSCCArray时,第二次在遍历数组时。
接下来,您不需要知道数组(或字符串)中的位置本身,只需要知道该位置是奇数还是偶数。这可以通过bool变量来实现。
接下来,输入字符串有哪些无效字符?处理这个案子是有道理的。
我的建议:
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;
}发布于 2016-11-04 18:54:36
我想你可以把它减少
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;https://codereview.stackexchange.com/questions/146122
复制相似问题