🔢

Luhn チェックおよびコード生成

2018/07/13に公開

Luhn ってなんぞ

詳しくは WikiPedia 参照で。
ざっくり言えば、数字列の入力が正しいかどうかを検証する仕組みの簡易版。
クレジットカードの番号に使われてる。
このチェックで正しいと判断されても、間違っている可能性はあるので、厳密な判定が必要なケースには使えない。

車輪の再開発感

アプリで使用することがあったので。
多分 node なら既になんらかの便利なモジュールが存在するはず。
クーポンコードとして使いたかったらしい。

利用目的

管理画面から数字列を発行 -> ユーザに配布 -> ユーザがアプリに入力 -> 送信前にアプリ内で簡単に入力チェック -> サーバ送信

実装例

export function check(numbers: string): boolean {
  const len = numbers ? numbers.length : 0
  let sum = 0
  let odd = true

  for (let i = len; i > 0; i--) {
      const num = Number(numbers[i - 1])
      sum += odd ? num : num * 2
      odd = !odd
  }

  return sum % 10 === 0 && sum > 0
}

export function generate(numbers: string): string {
    const len = numbers ? numbers.length : 0
    let sum = 0
    let odd = false

    for (let i = len; i > 0; i--) {
        const num = Number(numbers[i - 1])
        sum += odd ? num : num * 2
        odd = !odd
    }

    const checkNumber = ( sum % 10 ) > 0 ? 10 - ( sum % 10 ) : 0
    return numbers + String(checkNumber)
}

Discussion