2019年2月10日日曜日

node.jsで、バーコードのチェックデジット(モジュラス10ウェイト3)を計算したい

今回の記事では、個人的に必要でしたので、node.jsでもってバーコードのJAN13やITF等で使われているチェックデジット(モジュラス10ウェイト3)の計算をするプログラムを作ってみました。


■チェックデジットとは?

バーコードのバーをバーコードリーダーが読み取る時に、誤読が起きにくいようにチェック用の桁が付与されています。

このチェック用の桁をチェックデジットと呼びます。

このチェックデジットは、バーコードの種類に応じて様々な計算方法があるのですが、今回はその中でも特に「モジュラス10ウェイト3」を求める処理です。


■モジュラス10ウェイト3の計算方法

チェックデジットの計算方法
  • データの右から左に奇数桁、偶数桁と数えます。
  • 奇数桁を合算し3倍します=a
  • 偶数桁を合算します=b
  • a+bを合算します=c
  • 10-cの一桁目=d(ただし一桁目が0の時は0)
  • dがチェックデジット



■仕様

  • コンソール(PowerShell)で実行します。
  • コマンドは以下になります。
  • node.exe CHECKDIGIT.js チェックデジットを求めたい数列
  • 結果はチェックデジットと、チェックデジットを付与した結果の2つを表示します。


■コード



/**
 * @fileoverview チェックデジット(モジュラス10ウェイト3を求めます)
 * @param {string} process.argv[0] node.exe(システム)
 * @param {string} process.argv[1] 当該PG名(システム)
 * @param {string} process.argv[2] チェックデジットを求めたい数列
 */
/**
 * ルート処理
 */

try{
    /**
     * パラメータ変数は将来の増加を見込んで配列にしておきます
     */
    let aParam = new Array();
    
    if(process.argv.length !=3) {
        console.log("パラメータは、「チェックデジットを求めたい数列」で入力して下さい。");
        process.exit(1);
    } else {
        /**
         * 数列の取得方法
         * <ul>
         *     <li>パラメータを数列のみに変換</li>
         *     <li>配列に変換</li>
         *     <li>さらに逆順に変換</li>
         * </ul>
         */
        aParam[0] = new String(process.argv[2]).replace(/[^0-9]/g,'').split('').reverse();
    }
    proc1(aParam);
} catch(e) {
    procE(e,"root");
}
process.exit(0);

/**
 * メイン処理(チェックデジットの算出)
 * @param  {array} aParam [0]{array}=チェックデジットを求めたい数列
 */
function proc1(aParam) {
    let a = 0;
    let b = 0;
    let c = 0;
    let d = 0;
    let i = 1;
    try{
        /**
         * チェックデジットの計算方法
         * <ul>
         *     <li>データの右から左に奇数桁、偶数桁と数えます。<li>
         *     <li>奇数桁を合算し3倍します=a</li>
         *     <li>偶数桁を合算します=b</li>
         *     <li>a+bを合算します=c</li>
         *     <li>10-cの一桁目=d(ただし一桁目が0の時は0)</li>
         *     <li>dがチェックデジット</li>
         * </ul>
         */
        //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
        aParam[0].forEach(element => {
            i%2 === 1 ? a+=parseInt(element,10) : b+=parseInt(element,10);
            i++;
        })
        //@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
        c=(a*3)+b;
        d = parseInt(new String(c).slice(-1),10);
        d = (d === 0 ? 0 : 10-d);
        console.log("チェックデジットは (" + d + ") です。");
        //console.log("結果は"+ (((aParam[0]).reverse()).join("")) + new String(d));
        console.log("結果は" + aParam[0].reverse().join("") + new String(d));
    }catch(e) {
        procE(e,proc1.name);
    }

    
}

/**
 * エラー処理
 * @param  {object} e
 * @param  {string} sName
 */
function procE(e,sName) {
    try{
        console.log("[" + sName + "でエラー発生]" + e.name + "(" + e.message + ")");
        process.exit(1);
    }catch(e){
        console.log("エラー処理失敗" + e.name + "(" + e.message + ")");
    }

}


↑コンソールプログラムは、画面の設計とか処理に一切合切煩わされる事なく、本当に淡々と主処理を書けるのでなんか新鮮というか素朴に楽しいですね。


↑ たとえば、978479805347と、192305502800のチェックデジットを求めてみます。


node.exe c:¥Temp¥CHECKDIGIT.js 9784798053479


node.exe c:¥Temp¥CHECKDIGIT.js 192305502800

↑すると、978479805347のチェックデジットは(9)で、結果は9784798053479となります。

192305502800のチェックデジットは(5)で、結果は1923055028005となります。


↑Excel 2019で検算してみると一致していたので大丈夫だと思われます。