web analytics

IBAN nummers controleren

Print Friendly, PDF & Email

Wat zijn IBAN nummers?

IBAN staat voor International Bank Account Number en het is een internationaal overeengekomen systeem om banknummers over de grenzen heen te kunnen gebruiken en tevens de fouten tot een minimum te beperken. Het is een internationale standaard gekend onder ISO 13616:1997 .

Structuur van een IBAN nummer

Het IBAN telt maximaal 34 alfanumerieke tekens en heeft een vaste lengte per land.

Het IBAN bestaat uit de volgende combinatie alfanumerieke tekens:

  • een landcode bestaande uit twee letters volgens ISO 3166-1,
  • een controlegetal bestaande uit twee cijfers volgens ISO 7064,
  • een rekeningidentificatie bestaande uit maximaal 30 cijfers en letters

Omwille van leesbaarheid wordt het nummer conform ISO13616 in groepen van vier tekens geschreven, de laatste groep kan minder dan vier tekens bevatten. Enkele voorbeelden:

Land IBAN Nummer
Duitsland DE44 5001 0517 5407 3249 31
Griekenland GR16 0110 1250 0000 0001 2300 695
Verenigd Koninkrijk GB29 NWBK 6016 1331 9268 19
Saudi Arabië SA03 8000 0000 6080
Zwitserland CH93 0076 2011 6238 5295 7
Turkije TR33 0006 1005 1978 6457 8413 26

Controle op juistheid

Als je, zoals ik, een programma aan het schrijven bent waar er IBAN-nummers moeten worden ingegeven is het aan te raden om zelf een controle routine schrijven in je programma.

Ondanks de verschillende formaten per land is de controle om te zien of je een geldig nummer hebt, identiek voor alle IBAN-nummers als is het niet simpel.

Hieronder het stappenplan om de controle uit te voeren met als voorbeeld een Grieks IBAN nummer: GR1601101250000000012300695

Stap 1:

Verplaats de eerste 4 tekens “GR16” naar het einde van de string. Het IBAN wordt dan 01101250000000012300695GR16

Stap 2:

Vervang de letters in het IBAN door volgende cijfers

A = 10 G = 16 M = 22 S = 28 Y = 34
B = 11 H = 17 N = 23 T = 29 Z = 35
C = 12 I = 18 O = 24 U = 30
D = 13 J = 19 P = 25 V = 31
E = 14 K = 20 Q = 26 W = 32
F = 15 L = 21 R = 27 X = 33

Ons IBAN wordt dan 01101250000000012300695162716

Stap 3:

Deel het IBAN 01101250000000012300695162716 door 97. Je kan dat doen met de ingebouwde rekenmachine van Windows 10 als je die op wetenschappelijke mode zet. We zijn geïnteresseerd in de rest van onze deling, ook wel Modulo genaamd.

afbeelding-3Gelukkig is de wetenschappelijke mode van de rekenmachine voorzien van de toets Mod (voor modulo) en je kan zo direct het resultaat bekijken.

Ook laat de wetenschappelijke mode toe zo’n lang getal in te geven.

 

011012500000000123afbeelding-400695162716 MOD 97 ==> 1  als resultaat

Als de modulo = 1, dan is je IBAN correct anders heb je niet te maken met een IBAN nummer.

 

En nu de code

Tot zover het theoretisch gedeelte. Dat moet je dan natuurlijk omzetten in code en voor al de landen die een IBAN systeem gebruiken voorzien.

Ik ontwikkel onder Windows10 met Visual Studio 2015 en in VB.NET

Ik heb alles in een class clsIBAN.cls geplooid en die ziet er als volgt uit:

Imports System.Text
Imports System.Text.RegularExpressions

Public Class clsIBAN

    Public Function IsValidIBAN(sIBAN As String) As Boolean

        '===================================================================
        ' This Function checks the validity of an IBAN number
        ' Input:        IBAN to be checked as String
        ' Returns:      True is IBAN is valid, False if IBAN is invalied
        ' Requirements: Imports System.Text
        '               Imports System.Text.RegularExpressions
        ' Version:      1.7 - dd 20160920
        ' Author:       A.J. Baudrez
        '===================================================================
        Dim AsciiOffset As Integer = 55
        Dim IBANInCijfers As String = String.Empty
        Dim sIBANWerkString As String = String.Empty
        Dim iIBANRequiredLength As Integer = 0


        ' Maak een Dictionary aan met de 2 letter code voor het land
        ' en de lengte van de IBAN string
        Dim dict As New Dictionary(Of String, Integer)()
        ' Vul de Dictionary op met land code en aantal tekens voor hun IBAN
        With dict
            .Add("AL", 28) ' Albania
            .Add("AD", 24) ' Andorra
            .Add("AT", 20) ' Austria
            .Add("BE", 16) ' Belgium
            .Add("BA", 20) ' Bosnia
            .Add("BU", 22) ' Bulgaria
            .Add("HR", 21) ' Croatia
            .Add("CY", 28) ' Cyprus
            .Add("CZ", 24) ' Czech Republic
            .Add("DK", 18) ' Denmark
            .Add("EE", 20) ' Estonia
            .Add("FO", 18) ' Faroe Islands
            .Add("FI", 18) ' Finland
            .Add("FR", 27) ' France
            .Add("DE", 22) ' Germany
            .Add("GI", 23) ' Gibraltar
            .Add("GR", 27) ' Greece
            .Add("GL", 18) ' Greenland
            .Add("HU", 28) ' Hungary
            .Add("IS", 26) ' Iceland
            .Add("IE", 22) ' Ireland
            .Add("IL", 23) ' Israel
            .Add("IT", 27) ' Italy
            .Add("LV", 21) ' Latvia
            .Add("LI", 21) ' Liechtenstein
            .Add("LT", 20) ' Lithuania
            .Add("LU", 20) ' Luxembourg
            .Add("MK", 19) ' Macedonia
            .Add("MT", 31) ' Malta
            .Add("MU", 30) ' Mauritius
            .Add("MC", 27) ' Monaco
            .Add("ME", 22) ' Montenegro
            .Add("NL", 18) ' Netherlands
            .Add("NO", 15) ' Northern Ireland
            .Add("PO", 28) ' Poland
            .Add("PT", 25) ' Portugal
            .Add("RO", 24) ' Romania
            .Add("SM", 27) ' San Marino
            .Add("SA", 24) ' Saudi Arabia
            .Add("RS", 22) ' Serbia
            .Add("SK", 24) ' Slovakia
            .Add("SI", 19) ' Slovenia
            .Add("ES", 24) ' Spain
            .Add("SE", 24) ' Sweden
            .Add("CH", 21) ' Switzerland
            .Add("TR", 26) ' Turkey
            .Add("TN", 24) ' Tunesia
            .Add("GB", 22) ' United Kingdom
        End With

        ' De letters moeten in uppercase staan en losse spaties voor en na moeten weg
        sIBAN = sIBAN.ToUpper.Trim

        ' Wat opkuis. Geen streepjes of spaties meenemen uit een textbox of een Maskedbox
        sIBAN = sIBAN.Replace("-", "")
        sIBAN = sIBAN.Replace(" ", "")

        ' Bestaat het land?
        ' Indien Ja, pluk het aantal tekens voor dat land
        If dict.ContainsKey(sIBAN.Substring(0, 2)) = True Then
            iIBANRequiredLength = dict(sIBAN.Substring(0, 2))

        ' Landcode bestaat niet
        Else
            MessageBox.Show("Country does not exists")
            Return False
        End If

        'Correcte Lengte voor het gekozen land?
        If sIBAN.Length <> iIBANRequiredLength Then
            MsgBox("Wrong Length")
            Return False
        End If

        If String.IsNullOrEmpty(sIBAN) Then ' Mag niet leeg zijn
            Return False

        ElseIf Regex.IsMatch(sIBAN, "^[A-Z0-9]") Then 'Bevat de juiste karakters

            'Pas het formaat aan
            'Verplaats de eerste 4 tekens naar achter
            sIBANWerkString = sIBAN.Substring(4, sIBAN.Length - 4) + sIBAN.Substring(0, 4)

            'Doorloop de string en voor iedere letter, vul de vervangende cijfers in 
            For Each Teken As Char In sIBANWerkString
                If Not IsNumeric(Teken) Then
                    Dim LetterNaarCijfers As String
                    LetterNaarCijfers = (Asc(Teken) - AsciiOffset).ToString
                    IBANInCijfers &= LetterNaarCijfers
                Else
                    IBANInCijfers &= Teken
                End If
            Next
            
            ' Maak van de string een decimaal getal
            Dim IBANTotal As Decimal = CDec(IBANInCijfers)
            ' Bereken de Modulo
            Dim ModOutcome As Integer = IBANTotal Mod 97
            'Is het resultaat 1, dan is het een goed IBAN nummer
            If ModOutcome = 1 Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If

        'Indien we hier belanden is er iets fout gelopen       
        Return True

    End Function

    ' IS het een Uppercase letter, dan True terug geven
    Private Function IsASCII(s As String) As Boolean
        Return Asc(s) >= Asc("A") And Asc(s) <= Asc("Z")
    End Function

End Class
	

Ik heb met die class al menig IBAN gecontroleerd en die doet het prima.
Als je geen internationale IBAN gebruikt in je programma, kun je de ‘dict’ natuurlijk weglaten.

198 totaal aantal vertoningen, 6 aantal vertoningen vandaag

Beoordeling

Geef een reactie

%d bloggers liken dit: