計算方法は、モジュラス10 ウエイト3-1 (一括) と呼ばれる。
アルゴリズム名がmodulus10で、奇数桁計3倍、偶数桁 1倍、足し方が一括?だから!
JANバーコードのアルゴリズムは、末尾から奇数桁に3、偶数桁に1を掛けてから単純に足し算し、結果を10で割った余り(剰余)を求め、10からその剰余を引いた値をチェックディジットとして用いている。
例えば「49722536」というJAN8バーコードを例にすると、末尾6がチェックディジットである。この6はどう求められているかというと、次のように求めているわけである。
奇数桁の算出(4+7+2+3)×3→48
偶数桁の加算48+(9+2+5)→64
10から(2)の10の剰余を引く10-4→6
もって、ディジット6は正当であることが求められた。
rubyで書いてみた。
# check_digit.rb # check digit / modulus10 wait 3-1 (MOD 10) # for JAN (EAN), ISBN-13 # usage : $ check_digit.rbexit unless ARGV.size == 1 num = ARGV.shift # チェックデジットを取得したい数字をセット exit unless [7,12].include?(num.size) # JAN(EAN)は、8桁,13桁のいずれか。C/D分を減らす。 pos = total_even = total_odd = 0 # even 偶数、odd 奇数 # C/D分の桁を補完し、文字列を逆にして桁を1桁目から取る。split(//)で1文字単位に分割。 (num + '0').reverse.split(//).each do |s| pos += 1 # 偶数桁、奇数桁を判断し、それぞれ加算。 (pos % 2) == 0 ? total_even += s.to_i : total_odd += s.to_i end p 10 - (total_even * 3 + total_odd * 1) % 10 # ウエイト付けて、補数にして
実行結果は、以下の通り。
[baker@www work]$ ruby check_digit.rb 4972253 6 # 最終コードは、49722536 [baker@www work]$ ruby check_digit.rb 491012345064 3 # 最終コードは、4910123450643
0 件のコメント:
コメントを投稿