LoginSignup
1
1

More than 5 years have passed since last update.

誰得、バーコードの13桁目を生成するLambdaで動くNodeスクリプト

Last updated at Posted at 2016-10-25

概要

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));
    }
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1