■チェックデジットとは?
バーコードのバーをバーコードリーダーが読み取る時に、誤読が起きにくいようにチェック用の桁が付与されています。
このチェック用の桁をチェックデジットと呼びます。
このチェックデジットは、バーコードの種類に応じて様々な計算方法があるのですが、今回はその中でも特に「モジュラス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
192305502800のチェックデジットは(5)で、結果は1923055028005となります。
↑Excel 2019で検算してみると一致していたので大丈夫だと思われます。