バーコードのチェック ディジットの計算方法に関する私の理解に基づいて、次のようになります。
0) Sum the values of all the characters at odd indexes (1, 3, etc.)
1) Multiply that sum by 3
2) Sum the values of all the characters at even indexes (o, 2, etc.)
3) Combine the two sums from steps 1 and 2
4) Calculate the check digit by subtracting the modulus 10 of the combined sum from 10
たとえば、バーコード「04900000634」の合計は 40* です。チェックサムを取得するには、モジュラス (40 % 10) == 0、次に 10 - 0 == 10 です。
- 奇数文字 == 7; X3 = 21; 偶数文字 == 19、合計で 40。
チェック ディジットはスカラー値なので、チェック ディジットの計算結果が 10 の場合はどうなるでしょうか。「0」または「1」のどちらを使用しますか?
これが私が使用しているコードです(ここからの助けに感謝します:Why does 1 + 0 + 0 + 0 + 3 == 244?); バーコードの長さ (8 文字、12 文字など) とタイプ (128、EAN8、EAN12 など) に関係なく、上記の擬似コード化された式が適用されると想定しています。
private void button1_Click(object sender, EventArgs e)
{
string barcodeWithoutCzechSum = textBox1.Text.Trim();
string czechSum = GetBarcodeChecksum(barcodeWithoutCzechSum);
string barcodeWithCzechSum = string.Format("{0}{1}", barcodeWithoutCzechSum, czechSum);
label1.Text = barcodeWithCzechSum;
}
public static string GetBarcodeChecksum(string barcode)
{
int oddTotal = sumOddVals(barcode);
int oddTotalTripled = oddTotal*3;
int evenTotal = sumEvenVals(barcode);
int finalTotal = oddTotalTripled + evenTotal;
int czechSum = 10 - (finalTotal % 10);
return czechSum.ToString();
}
private static int sumEvenVals(string barcode)
{
int cumulativeVal = 0;
for (int i = 0; i < barcode.Length; i++)
{
if (i%2 == 0)
{
cumulativeVal += Convert.ToInt16(barcode[i] - '0');
}
}
return cumulativeVal;
}
private static int sumOddVals(string barcode)
{
int cumulativeVal = 0;
for (int i = 0; i < barcode.Length; i++)
{
if (i % 2 != 0)
{
cumulativeVal += Convert.ToInt16(barcode[i] - '0');
}
}
return cumulativeVal;
}
アップデート
ここの計算機: http://www.gs1us.org/resources/tools/check-digit-calculatorは、04900000634 のチェック ディジットが 6 であると主張しています。
それはどのように達成されていますか?
更新 2
このhttp://www.gs1.org/barcodes/support/check_digit_calculator は、方程式/式の最後の部分についての私の理解を修正します。「10 の最も近い等しいかそれ以上の倍数から合計を引く = 60- 57 = 3(チェックデジット)」
したがって、04900000634 の場合、合計は 40 になります。その式に基づいて、40 の「10 の最も近い等しいかそれ以上の倍数」は 40 であるため、40-40=0 であり、それがチェックになると予想されます。合計(6ではない)...だから、まだ混乱している...
更新 3
理由はまだわかりませんが、sumOddVals() 関数と sumEvenVals() 関数で "==" と "!=" のロジックを逆にすると、私の結果はhttpによって生成された結果に対応するため、mike z のコメントは正しいに違いありません。 ://www.gs1us.org/resources/tools/check-digit-calculator
更新 4
どうやら、 http://en.wikipedia.org/wiki/European_Article_Numberに基づいて、チェック ディジットの計算の背後にある権力は、最初の位置を位置 0 ではなく、位置 1 と見なします。 1 ではなく、インデックス 0 に存在する最初のアイテム!