概要
JANコードのチェックデジットを生成したくてnodeで書いてみた(誰得
前提条件
http://www.dsri.jp/jan/check_digit.html
ここに書いてある計算方法を元に13桁目(チェックデジット)を計算します。
[計算方法]
①与える12桁の数値を逆順にする(与えた数の先頭を2とする-チェックデジットが1番めとなるため-)
②逆順の偶数番目の数を全て足しあわせ、3倍するa
③逆順の奇数番目の数を全て足し合わせるb
④aとbを足し合わせた数の下一桁が0なら末尾は0となる
④’ aとbを足し合わせた数の下一桁(c)が0以外なら10-cが末尾となる
実装
Lambdaファンクションから呼び出す関数として実装したかったので呼び出される側として書きました。
構成
index.js
function/checkDigit.js
呼び出し元
index.js
'use strict';
var aws = require('aws-sdk');
var CheckDigit = require('./function/CheckDigit.js');
exports.handler = function (event, context) {
var janCode = '123456789012';
CheckDigit(janCode, function(data){
console.log(data);
context.succeed();
});
};
チェックデジット生成関数
checkDigit.js
//12桁の数字を与える
var CheckDigit = function (jan, callback) {
getReverse(jan, function (req) {
getTotal(req, function (sumEven, sumOdd) {
getDigit(sumEven, sumOdd, function (digit) {
callback(jan + digit);
});
});
});
};
module.exports = CheckDigit;
// 逆順にする
function getReverse(req, callback) {
callback(req.split("").reverse().join(""));
}
// 偶数列、奇数列をそれぞれ足し合わせて返す
function getTotal(req, callback) {
var arr = req.split("");
var evenList = [];
var oddList = [];
var len = arr.length;
var lim = 0;
for (var i = 0; i < len; i++) {
lim++;
var num = arr[i];
if (i % 2 !== 0) {
evenList.push(Number(num));
} else {
oddList.push(Number(num));
}
if (lim === len) {
var eve = evenList.reduce(function(a, b){ return a + b });
var odd = oddList.reduce(function(a, b){ return a + b });
callback(eve, odd * 3);
}
}
}
// 偶数の合計と奇数の合計を足した末尾を使ってチェックデジットを返す
function getDigit(sumEven, sumOdd, callback) {
var sum = sumEven + sumOdd;
var end = Number(String(sum).slice(-1));
if (end === 0) {
callback('0');
} else {
var req = 10 - end;
callback(String(req));
}
}