Controle bankrekening met Elfproef

Er zijn in Nederland twee soorten nummerreeksen bij bankrekeningnummers. Vanaf 2009 komen deze alleen bij de ING voor (na de intregratie van de Postbank, waarbij het woord „Giro” is vervallen). De voormalige Postbank-rekeningnummers (hieronder ook gironummers genoemd) blijven na de naamswijziging 1 tot 7 cijfers lang, de overige zijn 9 of 10 cijfers (respectievelijk betaal- en overige rekeningen).
De andere banken kennen traditioneel alleen maar de 9 of 10 cijferige nummers. Op termijn zal het internationale bankrekeningnummer (IBAN) samen met BIC de nieuwe standaard worden. Voor Nederland betekent dit dat het (negencijferige) rekeningnummer zal worden omgezet in een rekeningnummer met achttien posities. Er komen dan Europese standaarden voor overboekingen en automatische incasso’s. Deze nieuwe Europese standaarden hebben de benaming SEPA Credit Transfer (Europese overboeking) en SEPA Direct Debit (Europese incasso).

De voormalige Postbankrekeningnummers hebben geen controlegetal, die van de andere banken wel. Een Nederlands banknummer controleren is niet zo moeilijk, zeker niet met onderstaande code.

In onderstaande code ga ik ervan uit dat de code wordt gebruikt om de invoer in een (Drupal-)formulier te valideren.

Hieronder wordt gesproken over de elfproef. De officiële benaming is: modulo 11 controle.

Validatiefase in een formulier

In de validatiefase van een formulier is een controle op bank- of gironummer noodzakelijk. Er zijn een aantal controles van belang:

  • het nummer mag niet leeg zijn —> te realiseren ofwel in de opties van het veld ofwel in de controle bij de validatie
  • de string moet numeriek zijn
  • het nummer moet > 0 zijn —> te realiseren ofwel in de opties van het veld ofwel in de controle bij de validatie
  • het nummer mag niet langer zijn dan 9 (betaalrekeningen) of 10 (overige rekeningen) cijfers: dit is in te stellen in het formulierveld
  • het nummer mag niet exact 8 cijfers lang zijn
  • als het nummer langer is dan 8 cijfers: de elfproef zelf.
  • als het nummer < 8 cijfers dan is het een ING nummer (een voormalige Postbankrekening).

Een voorbeeld van deze controle is (verbeterde versie van 13 mei 2010):

// verwijder spaties voor / achter het nummer
$banknr = trim($edit['banknummer'];
// is het nummer leeg --> fout
if ($banknr == '') {
form_set_error('bankrekening', 'Bankrekening is verplicht');
}
// rekeningnummer: alleen cijfers
else if (!is_numeric($banknr)) {
form_set_error('bankrekening', 'De bankrekening bevat ongeldige tekens');
}
else {
// verwijder voorloopnullen
while (substr($banknr, 0, 1) == '0' && strlen($banknr > 0)) {
$banknr = substr($banknr, 1);
}
// is het nummer 0?
else if ($banknr == 0) {
form_set_error('bankrekening', 'De bankrekening is ongeldig');
}
  // rekeningnummer: controle op lengte
  $len = strlen($banknr);
  if ($len > 10) {
    return 'De bankrekening bevat te veel cijfers';
  }

// lengtecontrole alleen op lengte 8: controle hierboven:
// minimaal 1, veldlengte = maximaal 9 of 10 cijfers: in de formulier opties te zetten
switch ($len) {
case 9:
case 10:
// bankrekening -> controle met elfproef
if (elfproef($banknr))
form_set_error('bankrekening', 'De bankrekening is onbestaanbaar');
break;
case 8:
// een Nederlands rekeningnummer kan nooit 8 lang zijn
form_set_error('bankrekening', 'De bankrekening is fout: een rekeningnummer van 8 cijfers bestaat niet');
break;
default:
// een postbank-nummer
break;
}
}

De functie elfproef

/**
* controleer een banknummer met behulp van de elfproef
* returns: true als fout, false als voldoet aan de proef
*/
function elfproef($banknr) {
$res = 0;
// vermenigvuldigingsfactor = lengte van de string.
// Officieel kan een banknummer 9 of 10 cijfers zijn !
$verm = strlen($banknr);
for ($i = 0; $i < strlen($banknr); $i++, $verm--) {
$res += substr($banknr, $i, 1) * $verm;
}
return ($res % 11);
}

Wilt u uw eigen rekeningnummer controleren? Test het hier. ATTENTIE: diverse personen gebruiken de zoekfunctie voor de controle. Die zoekt alleen of uw nummer op een van de pagina’s op deze website voorkomt! En voert dus geen controle uit!

Een controle-programma voor een IBAN / SEPA nummer staat hier.