[解決済み] クレジットカードの番号からカードの種類を判別する方法は?
質問
クレジットカードの番号だけで、カードの種類を判別する方法を考えています。誰かこれを見つける決定的で信頼できる方法を知っていますか?
どのように解決するのですか?
クレジットカード/デビットカードの番号は、以下のように呼ばれます。 PAN または プライマリー・アカウント・ナンバー . PANの最初の6ケタは IIN または 発行体識別番号 IINは以前はBIN(Bank Identification Numbers)と呼ばれていたため、一部の文書ではその用語が使われていることがあります)。 この6桁の数字は、国際標準に従ったものです。 ISO/IEC 7812 この番号から、カードの種類を判別することができます。
残念ながら実際のISO/IEC 7812データベースは公開されていませんが、以下のような非公式のリストが商用・フリー問わず存在します。 ウィキペディア .
とにかく、数字から種類を判別するには、以下のような正規表現を使えばいい。 オリジナル表現へのクレジット
ビザです。
^4[0-9]{6,}$
Visaのカード番号は4から始まります。
マスターカード
^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$
2016年以前は、MasterCardの番号は51から55の数字で始まります。
が、これはMasterCardのクレジットカードのみを検出する
マスターカードのシステムを使って発行されたカードには、このIIN範囲に含まれないものもあります。 2016年には、(222100-272099)の範囲の番号が追加される予定です。
アメリカン・エキスプレス
^3[47][0-9]{5,}$
アメリカン・エキスプレスのカード番号は、34または37で始まります。
ダイナースクラブ
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
ダイナースクラブのカード番号は、300から305、36、38で始まります。5から始まる16桁のダイナースクラブカードもあります。ダイナースクラブとマスターカードのジョイントベンチャーであり、マスターカードと同様に処理される必要があります。
ディスカバー
^6(?:011|5[0-9]{2})[0-9]{3,}$
ディスカバーのカード番号は、6011または65で始まります。
JCBです。
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
JCBカードは2131、1800、35で始まる。
残念ながら、MasterCardのシステムで処理されるカードには、MasterCardのIIN範囲(51~55で始まる番号)に含まれないものが多数あります。最も重要なケースはMaestroカードで、その多くは他の銀行のIIN範囲から発行されているため、番号空間の至るところに配置されています。 その結果 他の種類のカードでないものは、すべてマスターカードであると考えたほうがよいでしょう。 .
重要 例えば、Visaは過去に13桁のPAN番号のカードと16桁のPAN番号のカードを発行したことがあります。 Visaの資料によると、現在、12桁から19桁の番号を発行する、または発行した可能性があるとのことです。 したがって、カード番号の長さは、少なくとも7桁であることを確認する以外には、確認しない方がよいでしょう (完全なIINと1つのチェックデジットを加えたもの。 Luhnアルゴリズム ).
さらにヒントをひとつ。 カード会員の PAN を処理する前に、入力から空白文字と句読点を取り除きます。 . なぜか? それは、通常 大いに 実際のクレジットカードの表面に表示されているのと同じように、数字をグループ化して入力するのが簡単です。
4444 4444 4444 4444
よりもはるかに簡単に正しく入力することができます。
4444444444444444
ここで想定外の文字が入力されたからといって、ユーザーを非難するメリットはありません。
このことは、入力フィールドに 少なくとも 24文字でないと、ユーザーがスペースを入力する際にスペースが足りなくなります。 32文字を表示できるようにフィールドの幅を広くし、64文字まで表示できるようにすると、拡張のための十分なスペースができますね。
もう少し詳しくわかる画像はこちらです。
UPDATE(2016年)。 Mastercardは、新しいBINレンジを開始する予定です。 アッ支払 .
関連
-
operator=' にマッチしない等号の両端がマッチしない
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み] Big-O表記とLittle-O表記の違いについて
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
-
[解決済み】インプレース基数ソート
-
[解決済み] 3つ以上の数値の最小公倍数
-
[解決済み] アマゾンのレコメンデーション機能の仕組み
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] O(log n)とは具体的にどのような意味ですか?
-
[解決済み] 素数かどうかを判断するのに、なぜ平方根まで確認するのか?
-
[解決済み] 深さ優先探索(DFS)と幅優先探索(BFS)の使い分けはいつが実用的か?[クローズド]
-
[解決済み] Big-O表記とLittle-O表記の違いについて
-
[解決済み】このゲームの数学的/計算原理は何ですか?
-
[解決済み] Googleの面接でのトリッキーな質問
-
[解決済み] 行または列に 0 が含まれる場合、行列のすべてのセルに 0 を設定します。
-
[解決済み] 窓から猫を放り投げる
-
[解決済み] ある数字が回文であるかどうかを調べるには?
-
[解決済み] ロードされたサイコロをシミュレートするための効率的なデータ構造とアルゴリズムとは?