こんにちは、javascript
を使用してIBAN検証チェックを行う必要があります。
従う必要があるルールは
IBANの検証 IBANは、整数に変換し、基本的なmod-97操作(ISO 7064で説明)を実行することで検証されます。 IBANが有効な場合、剰余は1になります。
1。国ごとにIBANの合計の長さが正しいことを確認します。そうでない場合、IBANは無効です
2。最初の4文字を文字列の最後に移動します
。文字列の各文字を2桁に置き換え、文字列を拡張します。A= 10、B = 11、...、Z = 35
4。文字列を10進整数として解釈し、97で除算してその数値の剰余を計算します
私はこれをベラルーシのIBANで行っているため、次の形式に従う必要があります
2C 31N-
RU1230000000000000000000000000000
上記のルールを満たすために以下を変更するにはどうすればよいですか?
function validateIBAN(iban) {
var newIban = iban.toUpperCase(),
modulo = function (divident, divisor) {
var cDivident = '';
var cRest = '';
for (var i in divident ) {
var cChar = divident[i];
var cOperator = cRest + '' + cDivident + '' + cChar;
if ( cOperator < parseInt(divisor) ) {
cDivident += '' + cChar;
} else {
cRest = cOperator % divisor;
if ( cRest == 0 ) {
cRest = '';
}
cDivident = '';
}
}
cRest += '' + cDivident;
if (cRest == '') {
cRest = 0;
}
return cRest;
};
if (newIban.search(/^[A-Z]{2}/gi) < 0) {
return false;
}
newIban = newIban.substring(4) + newIban.substring(0, 4);
newIban = newIban.replace(/[A-Z]/g, function (match) {
return match.charCodeAt(0) - 55;
});
return parseInt(modulo(newIban, 97), 10) === 1;
}
このライブラリを使用して、IBANを検証およびフォーマットできます。 https://github.com/arhs/iban.js (免責事項:ライブラリを作成しました)
しかし、ロシアもベラルーシもサポートされていません。 wikipediaのIBANページ または IBAN公式レジストリ でこれらの国について言及していないので、自分でライブラリコードを変更して追加する必要があるのではないかと心配しています。
http://toms-cafe.de/iban/iban.js の作業に基づいて、IBANチェックのバージョンを開発しました。
変数CODE_LENGTHSを変更することにより、国のサポートを変更できます
これが私の実装です。
function alertValidIBAN(iban) {
alert(isValidIBANNumber(iban));
}
/*
* Returns 1 if the IBAN is valid
* Returns FALSE if the IBAN's length is not as should be (for CY the IBAN Should be 28 chars long starting with CY )
* Returns any other number (checksum) when the IBAN is invalid (check digits do not match)
*/
function isValidIBANNumber(input) {
var CODE_LENGTHS = {
AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22, BR: 29,
CH: 21, CR: 21, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28, EE: 20, ES: 24,
FI: 18, FO: 18, FR: 27, GB: 22, GI: 23, GL: 18, GR: 27, GT: 28, HR: 21,
HU: 28, IE: 22, IL: 23, IS: 26, IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28,
LI: 21, LT: 20, LU: 20, LV: 21, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27,
MT: 31, MU: 30, NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29,
RO: 24, RS: 22, SA: 24, SE: 24, SI: 19, SK: 24, SM: 27, TN: 24, TR: 26
};
var iban = String(input).toUpperCase().replace(/[^A-Z0-9]/g, ''), // keep only alphanumeric characters
code = iban.match(/^([A-Z]{2})(\d{2})([A-Z\d]+)$/), // match and capture (1) the country code, (2) the check digits, and (3) the rest
digits;
// check syntax and length
if (!code || iban.length !== CODE_LENGTHS[code[1]]) {
return false;
}
// rearrange country code and check digits, and convert chars to ints
digits = (code[3] + code[1] + code[2]).replace(/[A-Z]/g, function (letter) {
return letter.charCodeAt(0) - 55;
});
// final check
return mod97(digits);
}
function mod97(string) {
var checksum = string.slice(0, 2), fragment;
for (var offset = 2; offset < string.length; offset += 7) {
fragment = String(checksum) + string.substring(offset, offset + 7);
checksum = parseInt(fragment, 10) % 97;
}
return checksum;
}
また、これは有効な fiddle です
「Jquery validation plugin」もibanチェックをサポートしています。
https://github.com/jzaefferer/jquery-validation/blob/master/src/additional/iban.js
以前の回答に基づいて、Angular Directive
メソッドを実装するValidator
を作成しました。
タイプも追加しました。
iban-validator.directive.ts
import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms';
import { Directive } from '@angular/core';
@Directive({
selector: '[ibanValidators]',
providers: [{
provide: NG_VALIDATORS,
useExisting: IbanValidatorDirective,
multi: true
}]
})
export class IbanValidatorDirective implements Validator {
validate(control: AbstractControl): { ibanValid: boolean; } | object {
const codeLengths = {
AD: 24, AE: 23, AL: 28, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22, BR: 29, CH: 21, CR: 21, CY: 28, CZ: 24,
DE: 22, DK: 18, DO: 28, EE: 20, ES: 24, LC: 30, FI: 18, FO: 18, FR: 27, GB: 22, GI: 23, GL: 18, GR: 27, GT: 28,
HR: 21, HU: 28, IE: 22, IL: 23, IS: 26, IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, LI: 21, LT: 20, LU: 20, LV: 21,
MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, MT: 31, MU: 30, NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29,
RO: 24, RS: 22, SA: 24, SE: 24, SI: 19, SK: 24, SM: 27, TN: 24, TR: 26
};
if (control.value) {
const iban = control.value.toUpperCase().replace(/[^A-Z0-9]/g, '');
const code = iban.match(/^([A-Z]{2})(\d{2})([A-Z\d]+)$/);
let digits: number;
if (!code || iban.length !== codeLengths[code[1]]) {
return { ibanValid: false };
}
digits = (code[3] + code[1] + code[2]).replace(/[A-Z]/g, (letter: string) => {
return letter.charCodeAt(0) - 55;
});
return this.mod97(digits) === 1 ? null : { ibanValid: false };
}
}
private mod97(digital: number | string) {
digital = digital.toString();
let checksum: number | string = digital.slice(0, 2);
let fragment = '';
for (let offset = 2; offset < digital.length; offset += 7) {
fragment = checksum + digital.substring(offset, offset + 7);
checksum = parseInt(fragment, 10) % 97;
}
return checksum;
}
}
次に、入力でディレクティブを使用します。