test-numbers-generator
Version:
Generate and validate European test phone numbers (mobile and landline) in safe, non-existent ranges.
43 lines (39 loc) • 1.82 kB
text/typescript
// 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 {
if (!/^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;
}