IBAN: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 4,351: | Line 4,351: | ||
GB42 WEST 1234 5698 7654 32 : no</pre> |
GB42 WEST 1234 5698 7654 32 : no</pre> |
||
=={{header|VBA}}== |
|||
{{trans|Phix}}<lang vb>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</lang>{{out}} |
|||
<pre>GB82WEST12345698765432 ok |
|||
GB82TEST12345698765432 invalid (as expected) |
|||
GB81WEST12345698765432 invalid (as expected) |
|||
SA0380000000608010167519 ok |
|||
CH9300762011623852957 ok</pre> |
|||
=={{header|VBScript}}== |
=={{header|VBScript}}== |
||
<lang vb> |
<lang vb> |