73 lines
2.2 KiB
Plaintext
73 lines
2.2 KiB
Plaintext
' FB 1.05.0 Win64
|
|
|
|
' List updated to release 72, 25 November 2016, of IBAN Registry (75 countries)
|
|
Dim Shared countryCodes As String
|
|
countryCodes = _
|
|
"AD24 AE23 AL28 AT20 AZ28 BA20 BE16 BG22 BH22 BR29 BY28 CH21 CR22 CY28 CZ24 DE22 " _
|
|
"DK18 DO28 EE20 ES24 FI18 FO18 FR27 GB22 GE22 GI23 GL18 GR27 GT28 HR21 HU28 IE22 " _
|
|
"IL23 IQ23 IS26 IT27 JO30 KW30 KZ20 LB28 LC32 LI21 LT20 LU20 LV21 MC27 MD24 ME22 " _
|
|
"MK19 MR27 MT31 MU30 NL18 NO15 PK24 PL28 PS29 PT25 QA29 RO24 RS22 SA24 SC31 SE24 " _
|
|
"SI19 SK24 SM27 ST25 SV28 TL23 TN24 TR26 UA29 VG24 XK20"
|
|
|
|
Function checkCountryCode(cc As String) As Boolean
|
|
Return Instr(countryCodes, cc)
|
|
End Function
|
|
|
|
' To avoid having to use the GMP library, a piece-wise calculation is used
|
|
Function mod97(s As String) As UInteger
|
|
Dim r As UInteger = ValULng(Left(s, 9)) Mod 97
|
|
Dim start As UInteger = 10
|
|
While start < Len(s)
|
|
r = ValULng(r & Mid(s, start, 7)) Mod 97
|
|
start += 7
|
|
Wend
|
|
Return r
|
|
End Function
|
|
|
|
Function validateIban(iban As Const String) As Boolean
|
|
' remove spaces from IBAN
|
|
Dim s As String = iban
|
|
Dim count As Integer = 0
|
|
For i As Integer = 0 To Len(s) - 1
|
|
If s[i] = 32 Then
|
|
For j As Integer = i + 1 To Len(s) - 1
|
|
s[j - 1] = s[j]
|
|
Next
|
|
count += 1
|
|
End If
|
|
If i = Len(s) - 1 - count Then Exit For
|
|
Next i
|
|
If count > 0 Then
|
|
s[Len(s) - count] = 0
|
|
Dim p As UInteger Ptr = CPtr(UInteger Ptr, @s)
|
|
*(p + 1) = Len(s) - count ''change length of string in descriptor
|
|
End If
|
|
|
|
' check country code
|
|
Dim isValid As Boolean = checkCountryCode(Left(s, 2) + Str(Len(s)))
|
|
If Not isValid Then Return False
|
|
|
|
' move first 4 characters to end
|
|
s = Mid(s, 5) + Left(s, 4)
|
|
|
|
' replace A to Z with numbers 10 To 35
|
|
For i As Integer = Len(s) To 1 Step -1
|
|
If s[i - 1] >= 65 AndAlso s[i - 1] <= 90 Then
|
|
s = Left(s, i - 1) + Str(s[i - 1] - 55) + Mid(s, i + 1)
|
|
End If
|
|
Next
|
|
|
|
' do mod97 calculation
|
|
Return mod97(s) = 1 '' remainder needs to be 1 for validity
|
|
End Function
|
|
|
|
Dim As String ibans(1 To 2) = {"GB82 WEST 1234 5698 7654 32", "GB82 TEST 1234 5698 7654 32"}
|
|
For i As Integer = 1 To 2
|
|
Dim isValid As Boolean = validateIban(ibans(i))
|
|
Print ibans(i); IIf(isValid, " : may be valid", " : is not valid")
|
|
Next
|
|
|
|
Print
|
|
Print "Press any key to quit"
|
|
Sleep
|