Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 1x 1x 1x 1x 1x 1x 1x 6x 1x 1x 1x 2x 2x 12x 2x | // src/ibanGenerator.ts
/**
* Genereert een geldig Nederlands IBAN nummer voor testdoeleinden.
* Formaat: NLkkBBBB0123456789 (kk = controlegetal, BBBB = bankcode)
*/
export function generateTestDutchIBAN(bankCode: string = "TEST"): string {
// Bankcode moet 4 hoofdletters zijn
bankCode = bankCode.toUpperCase().padEnd(4, 'X').slice(0, 4);
// 10 random cijfers voor het rekeningnummer
const accountNumber = Math.floor(1000000000 + Math.random() * 9000000000).toString();
// IBAN zonder controlegetal
const partialIban = `NL00${bankCode}${accountNumber}`;
// Controlegetal berekenen
const checkDigits = calculateIbanCheckDigits(partialIban);
return `NL${checkDigits}${bankCode}${accountNumber}`;
}
/**
* Bereken het IBAN controlegetal volgens de mod-97 methode.
*/
function calculateIbanCheckDigits(iban: string): string {
// Zet letters om naar cijfers (A=10, B=11, ..., Z=35)
const rearranged = iban.slice(4) + iban.slice(0, 4);
// Let op: sommige banken geven een rekeningnummer met leidende nullen, dus we moeten alles als string behandelen
const replaced = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString());
// BigInt kan alleen werken met cijfers, dus we moeten de string splitsen als deze te lang is
// Maar voor Nederlandse IBANs is de string kort genoeg voor BigInt
const mod97 = 98n - (BigInt(replaced) % 97n);
return mod97.toString().padStart(2, '0');
}
/**
* Valideert of een string een geldig Nederlands IBAN is.
*/
export function isValidDutchIBAN(iban: string): boolean {
Iif (!/^NL\d{2}[A-Z]{4}\d{10}$/.test(iban)) return false;
// Mod-97 check
const rearranged = iban.slice(4) + iban.slice(0, 4);
const replaced = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString());
return BigInt(replaced) % 97n === 1n;
}
|