80 lines
2.2 KiB
Text
80 lines
2.2 KiB
Text
Public nations As New Collection
|
|
Private Sub init()
|
|
nations.Add 24, "AD"
|
|
nations.Add 21, "CH"
|
|
nations.Add 22, "GB"
|
|
nations.Add 24, "SA"
|
|
nations.Add 20, "XK"
|
|
End Sub
|
|
|
|
Private Function mod97(ByVal c As String) As Integer
|
|
Dim n As Long
|
|
n = Val(Mid(c, 1, 9))
|
|
c = Mid(c, 10, Len(c) - 9)
|
|
n = n Mod 97
|
|
Do While Len(c) > 6
|
|
n = Val(Str(n) & Mid(c, 1, 7))
|
|
n = n Mod 97
|
|
c = Mid(c, 8, Len(c) - 7)
|
|
Loop
|
|
n = Val(Str(n) & c)
|
|
mod97 = n Mod 97
|
|
End Function
|
|
|
|
Private Function iban(ByVal code As String) As Boolean
|
|
'-- This routine does and should reject codes containing spaces etc.
|
|
'-- Use iban_s() below for otherwise.
|
|
On Error GoTo 1
|
|
lengths = nations(Mid(code, 1, 2))
|
|
If Len(code) = lengths Then
|
|
code = code & Mid(code, 1, 4)
|
|
code = Mid(code, 5, lengths)
|
|
Dim c As String: c = ""
|
|
Dim ch As String
|
|
For i = 1 To lengths
|
|
ch = Mid(code, i, 1)
|
|
If ch >= "0" And ch <= "9" Then
|
|
c = c & ch
|
|
Else
|
|
If ch >= "A" And ch <= "Z" Then
|
|
c = c & Str(Asc(ch) - 55)
|
|
Else
|
|
iban = False
|
|
End If
|
|
End If
|
|
Next i
|
|
c = Replace(c, " ", "")
|
|
iban = mod97(c) = 1
|
|
End If
|
|
Exit Function
|
|
1:
|
|
iban = False
|
|
End Function
|
|
|
|
Private Function iban_s(code As String) As Boolean
|
|
'-- strips any embedded spaces and hyphens before validating.
|
|
code = Replace(code, " ", "")
|
|
code = Replace(code, "-", "")
|
|
iban_s = iban(code)
|
|
End Function
|
|
|
|
Private Sub test(code As String, expected As Boolean)
|
|
Dim valid As Boolean
|
|
valid = iban_s(code)
|
|
Dim state As String
|
|
If valid = expected Then
|
|
state = IIf(valid, "ok", "invalid (as expected)")
|
|
Else
|
|
state = IIf(valid, "OK!!", "INVALID!!") & " (NOT AS EXPECTED)"
|
|
End If
|
|
Debug.Print code, state
|
|
End Sub
|
|
|
|
Public Sub main()
|
|
init
|
|
test "GB82 WEST 1234 5698 7654 32", True
|
|
test "GB82 TEST 1234 5698 7654 32", False
|
|
test "GB81 WEST 1234 5698 7654 32", False
|
|
test "SA03 8000 0000 6080 1016 7519", True
|
|
test "CH93 0076 2011 6238 5295 7", True
|
|
End Sub
|