💾

ダミーのバーコードを生成する(JANコード対応)

2020/09/17に公開

バーコード(画像)を生成するツールは無限にあるのにバーコード(コード)を生成するツールは全然ないので作った。

バーコードには規格があり、その規格通りのものになっているかをチェックする機構もある。内容はシンプルで、例えばJANコードと呼ばれる規格であれば以下のようになる。

13桁の場合

{事業者コード9桁}{商品アイテムコード3桁}{チェックデジット1桁}

このように、バーコードの最後の1桁がチェックサムとなる。これをチェックデジットと呼ぶ。

チェックデジットの求め方は以下の手順で行う。

  1. チェックデジットを除く全ての偶数桁の数を足す
  2. 上記を3倍する
  3. チェックデジットを除く全ての奇数桁の数を足す
  4. 2と3の結果を足す
  5. 3の結果の下一桁を10から引いた数値が、バーコードの最後の一桁と一致する場合規格を満たす

詳しくは以下を参照
チェックデジットの計算方法

バーコードのフォーム入力でチェックデジットのバリデーションをかける際、とりあえず通したい時にいちいち現物のバーコードを探してくるのも面倒なので、ダミーのバーコードを生成するスクリプトを書いた。

https://github.com/ushironoko/fake-barcode-generator

src/generator.ts

function main(len: string[]) {
  try {
    const r = Math.random()
      .toString(10)
      .slice(-len[2] + 1)

    const body = [...r].map((s) => +s)

    const evenSum = body.filter((_, i) => i % 2 === 0).reduce((a, b) => a + b)
    const oddSum = body.filter((_, i) => i % 2 !== 0).reduce((a, b) => a + b)

    const checkDesit = 10 - +(evenSum * 3 + oddSum).toString().slice(-1)
    console.log(`${r}${checkDesit}`)
  } catch (e) {
    console.error(e)
  }
}

main(process.argv)

package.json

  "scripts": {
    "gen": "npx ts-node src/generator.ts 14"
  },

ほぼ書き捨てのつもりで作ったのでキャスト周りが雑だが、yarn gen するだけでJANコードのバリデーションを通過する数値が得られて便利。14桁決め打ちの部分は用途によって変えても良い。

今回は必要最低限な機能しか実装していない。拡張するとしたら引数でJANやEANみたいな文字列を受け取り、その規格にそったコードを吐くようにしたりconsole.logではなくcliやweb上で使えるようにしたりだろうか。現状ts-nodeで動かしているのでbarcodeGeneratorをexportしてライブラリとしてビルドしてもいいかもしれない。(何需要かわからないけど)

Discussion