💾
ダミーのバーコードを生成する(JANコード対応)
バーコード(画像)を生成するツールは無限にあるのにバーコード(コード)を生成するツールは全然ないので作った。
バーコードには規格があり、その規格通りのものになっているかをチェックする機構もある。内容はシンプルで、例えばJANコードと呼ばれる規格であれば以下のようになる。
13桁の場合
{事業者コード9桁}{商品アイテムコード3桁}{チェックデジット1桁}
このように、バーコードの最後の1桁がチェックサムとなる。これをチェックデジットと呼ぶ。
チェックデジットの求め方は以下の手順で行う。
- チェックデジットを除く全ての偶数桁の数を足す
- 上記を3倍する
- チェックデジットを除く全ての奇数桁の数を足す
- 2と3の結果を足す
- 3の結果の下一桁を
10
から引いた数値が、バーコードの最後の一桁と一致する場合規格を満たす
詳しくは以下を参照
チェックデジットの計算方法
バーコードのフォーム入力でチェックデジットのバリデーションをかける際、とりあえず通したい時にいちいち現物のバーコードを探してくるのも面倒なので、ダミーのバーコードを生成するスクリプトを書いた。
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