🔢
Luhn チェックおよびコード生成
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