43 lines
1.3 KiB
AutoHotkey
43 lines
1.3 KiB
AutoHotkey
IBANs := ["GB82 WEST 1234 5698 7654 32"
|
|
, "gb82 WEST 1234 5698 7654 32"
|
|
, "GB82WEST12345698765432"
|
|
, "GB82 WEST 234 5698 7654 32"
|
|
, "GB82 WEST 1234 5698 7654 33"
|
|
, "AE82 WEST 1234 5698 7654 32"]
|
|
for k, v in IBANs
|
|
Output .= v " is" (ValidIBAN(v) ? "" : " not") " valid.`n"
|
|
MsgBox, % Output
|
|
|
|
ValidIBAN(n) {
|
|
static CC := {AL:28, AD:24, AT:20, AZ:28, BH:22, BE:16, BA:20, BR:29, BG:22, CR:21
|
|
, HR:21, CY:28, CZ:24, DK:18, DO:28, EE:20, FO:18, FI:18, FR:27, GE:22
|
|
, DE:22, GI:23, GR:27, GL:18, GT:28, HU:28, IS:26, IE:22, IL:23, IT:27
|
|
, JO:30, KZ:20, KW:30, LV:21, LB:28, LI:21, LT:20, LU:20, MK:19, MT:31
|
|
, MR:27, MU:30, MC:27, MD:24, ME:22, NL:18, NO:15, PK:24, PS:29, PL:28
|
|
, PT:25, QA:29, RO:24, SM:27, SA:24, RS:22, SK:24, SI:19, ES:24, SE:24
|
|
, CH:21, TN:24, TR:26, AE:23, GB:22, VG:24}
|
|
StringReplace, n, n, % A_Space,, A
|
|
;Check that the total IBAN length is correct as per the country
|
|
if (StrLen(n) != CC[SubStr(n, 1, 2)])
|
|
return false
|
|
StringUpper, n, n
|
|
;Move the four initial characters to the end of the string
|
|
n := SubStr(n, 5) SubStr(n, 1, 4)
|
|
;Replace each letter in the string with two digits
|
|
Loop, Parse, n
|
|
{
|
|
if A_LoopField is alpha
|
|
nn .= Asc(A_LoopField) - 55
|
|
else
|
|
nn .= A_LoopField
|
|
}
|
|
return Mod97(nn) = 1
|
|
}
|
|
|
|
Mod97(a) {
|
|
while a {
|
|
rem := Mod(rem SubStr(a, 1, 15), 97)
|
|
a := SubStr(a, 16)
|
|
}
|
|
return rem
|
|
}
|