FinTech Dialy

FinTech Diary

FinTechのこととかクレジットのこととか。金融・ITの話題を中心に書いていきます。

【プログラミング】カード番号のチェックデジットを判定する(JavaScript)【クレジットカード】

カード番号の最後の一桁は「チェックデジット」と呼ばれ、カード番号の有効性を判定するのに利用されます。 今回はチェックデジットの判定を行うJavaScriptを実行してみますφ(..)



チェックデジットとは?

数値の入力誤りを検出するために、末尾に付与される数値。
チェックディジット、チェックサム、検査数字、検査文字などとも。
英語だとCheck Digit、略称はCD、C/D。
クレジットカード以外にも、バーコードや銀行の口座番号、マイナンバー等、色々な番号で使用されています。

[参考]IT用語辞典
www.weblio.jp

[参考]wikipedia
チェックディジット - Wikipedia


Luhnアルゴリズムとは?

チェックデジットを判定するアルゴリズムには「Dammアルゴリズム」「ヴァーヘフアルゴリズム」「Luhnアルゴリズム」等があり、 クレジットカードでは「Luhnアルゴリズム」を使用しています。

[参考]wikipedia
Luhnアルゴリズム - Wikipedia
色々な言語のサンプルコードが公開されています。



チェックデジット判定

カード番号を入力し「判定」ボタンを押すとダイアログに結果が表示されます。




適当に入れると大体エラーになりますw
例えば「1111222233334444」とか入れるとOKが出ます。



コード

HTML

onclickでShowCheckResultを実行。

<form name = fr_card_info>
<input name="card_num" type="text" value="" placeholder="カード番号 (半角数字)" size = "24" maxlength = "16" /> <br/>
<input type="button" value="判定" onclick="ShowCheckResult()">
</form>


JavaScript

一応数値チェック(NumCheck)も入れてます。
数値チェックOKの場合、チェックデジット判定(luhn_checksum)でチェックデジットを判定します。

<script language="javascript">
<!--
//チェック結果表示
function ShowCheckResult()
{
   in_card_num = document.fr_card_info.card_num.value;
   //カード番号チェック
   if(in_card_num == "" || NumCheck(in_card_num) == false){
      alert("カード番号には半角数値を入力して下さい"); 
      return;
   }
   //チェックデジット判定
   if(luhn_checksum(in_card_num) == false){
      alert("チェックNG(><;)"); 
      return;
   }
   //チェックOK
   alert("チェックOK( '-')b"); 
}

//数値チェック
function NumCheck(val) {
   if (val.match(/[^z0-9]+/)) {
   return false;
   }
}

//チェックデジット判定
function luhn_checksum(card_number) {
  var a, s, i, x;
  a = card_number.split("").reverse();
  s = 0;
  for (i = 0; i < a.length; i++) {
    x = a[i] * (1 + i % 2);
    s += x > 9 ? x - 9 : x;
  }
  return s % 10 == 0;
}
//-->
</script>



コード参考

以下、参考にさせて頂きましたm(_ _)m

[参考1]クレジットカード番号をチェックする

luhn_checksumを使用させて頂きました。

[参考2]【PHP】クレジットカードチェックサンプル

[参考3][メモ] 各種チェックデジットの計算方法

[参考4]Javascriptで入力チェック(半角英数字)

NumCheckを使用させて頂きました。

エクセルマクロ

私の大好きなエクセルマクロ(VBA)のサンプルもありました。
まあ使う機会があるかどうかは極めて微妙ですが…(-_- )


[参考]Luhn Algorithm Validation in VBScript (ASP)

www.nilpo.com


上記のコードをそのまま実行するとコンパイルエラーになってしまうので、参照設定にRegExpオブジェクトを追加する必要があります。

[参考]VBA正規表現を使う - RegExpオブジェクトの利用
codezine.jp



チェックデジット以外のカード番号の意味

せっかくなのでおまけで少し触れておきたいと思います。
簡単な解説をまとめました。

f:id:natsumedeus:20181004025930p:plain


[参考]クレジットカードプロ
https://www.card-x.net/contents/creditcard-number.htmlwww.card-x.net
[参考]GIZMODO
www.gizmodo.jp
[参考]wikipedia
クレジットカードの番号 - Wikipedia

ISO/IEC 7812 - Wikipedia


おわり

MASTERカードの先頭2導入とか、先頭1のブランド(UATP)とか、意外と新たな発見がありました。
ただの数字の羅列に見えるものにも、実は色々な意味が込められているんですね(' ' )