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="$_"
    len=$( expr "$code" : "[0-9]$" )
    if [ $len -eq 13 ]; then
        ar=( $( echo "$code" | sed 's/(.)/\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>&2
            return 1
        fi
    elif [ $len -eq 8 ]; then
        ar=( $( echo "$code" | sed 's/(.)/\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>&2
            return 1
        fi
    else
        echo isJAN: Number of digits error 1>&2
        return 2
    fi
}

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

#!/usr/bin/env bash
function isJAN(){
  (省略)
}

isJAN 4569951116179

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

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

export isJAN

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

※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。

投稿者:

dyama

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

コメントを残す

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

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