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 でしか動作しません。

[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
}
[/bash]

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

[bash]

!/usr/bin/env bash

function isJAN(){
(省略)
}

isJAN 4569951116179

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

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

[bash]$ export isJAN[/bash]

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

投稿者:

dyama

システムエンジニアです。佐世保に住んでいます。

コメントを残す

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