JAN コードのチェックスクリプト

財団法人 流通システム開発センターで公開されている JAN コードの仕様に基き、与えられた文字列が正しい JAN コードであるか否かを返すシェルスクリプト関数です。

JANコードの仕様

  • 0 から 9 までの数字 8 桁または 13 桁から構成される。
  • 桁数に関わらず、末尾の 1 桁はチェックデジット(誤り検出符号)として用いられる。
  • チェックデジットを除く部分は、企業コードとアイテムコードから成る。

チェックデジットの算出方法

  1. 奇数桁にある数の和に 3 をかける。
  2. チェックデジットを除く偶数桁にある数の和を求める。
  3. 1 と 2 の和で求められた数の下 1 桁を n とする。
  4. n が 0 の時、チェックデジットは 0 である。
  5. n > 0 の時、チェックデジットは 10 – n である。

計算して求められたチェックデジットと、与えられた JAN コードのチェックデジットを比較し、一致すれば正しい JAN コードとして判断します。

検査スクリプト

計算処理を Bash 依存形式で記述している為、Bash でしか動作しません。

function isJAN(){
  code=&quot;$<em>&quot;
  len=$( expr &quot;$code&quot; : &quot;[0-9]</em>$&quot; )
  if [ $len -eq 13 ]; then
    ar=( $( echo &quot;$code&quot; | sed 's/&#40;.&#41;/\1 /g' ) )
    n=$(( ( ${ar[1]} + ${ar[3]} + ${ar[5]} + ${ar[7]} + ${ar[9]} + ${ar[11]} ) * 3 ))
    m=$(( ${ar[0]} + ${ar[2]} + ${ar[4]} + ${ar[6]} + ${ar[8]} + ${ar[10]} ))
    a=$(( 10 - ( ( n + m ) % 10 ) ))
    if [ $a -eq 10 ]; then a=0; fi
    if [ ${ar[12]} -eq $a ]; then
      return 0
    else
      echo isJAN: Check digit error ${ar[12]} is not $a 1&gt;&amp;2
      return 1
    fi
  elif [ $len -eq 8 ]; then
    ar=( $( echo &quot;$code&quot; | sed 's/&#40;.&#41;/\1 /g' ) )
    n=$(( ( ${ar[0]} + ${ar[2]} + ${ar[4]} + ${ar[6]} ) * 3 ))
    m=$(( ${ar[1]} + ${ar[3]} + ${ar[5]} ))
    a=$(( 10 - ( n + m ) % 10 ))
    if [ $a -eq 10 ]; then a=0; fi
    if [ ${ar[7]} -eq $a ]; then
      return 0
    else
      echo isJAN: Check digit error 1&gt;&amp;2
      return 1
    fi
  else
    echo isJAN: Number of digits error 1&gt;&amp;2
    return 2
  fi
}

これは、次のようにスクリプト内で使用します。

</p>

<h1>!/usr/bin/env bash</h1>

<p>function isJAN(){
  (省略)
}</p>

<p>isJAN 4569951116179</p>

<p>if [ $? -eq 0 ]; then
  echo YES!
else
  echo NO!
fi

また、シェルで関数定義を行なった後、

$ export isJAN

しておけば、isJAN をコマンドとしても利用することができます。

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください