RosettaCodeData/Task/IBAN/EasyLang/iban.easy
2025-06-11 20:16:52 -04:00

63 lines
1.9 KiB
Text

cc$[] = [ "AD" "AE" "AL" "AO" "AT" "AZ" "BA" "BE" "BF" "BG" "BH" "BI" "BJ" "BR" "CG" "CH" "CI" "CM" "CR" "CV" "CY" "CZ" "DE" "DK" "DO" "DZ" "EE" "EG" "ES" "FI" "FO" "FR" "GA" "GB" "GE" "GI" "GL" "GR" "GT" "HR" "HU" "IE" "IL" "IR" "IS" "IT" "JO" "KW" "KZ" "LB" "LI" "LT" "LU" "LV" "MC" "MD" "ME" "MG" "MK" "ML" "MR" "MT" "MU" "MZ" "NL" "NO" "PK" "PL" "PS" "PT" "QA" "RO" "RS" "SA" "SE" "SI" "SK" "SM" "SN" "TN" "TR" "UA" "VG" ]
ln[] = [ 24 23 28 25 20 28 20 16 27 22 22 16 28 29 27 21 28 27 21 25 28 24 22 18 28 24 20 27 24 18 18 27 27 22 22 23 18 27 28 21 28 22 23 26 26 27 30 30 20 28 21 20 20 21 27 24 22 27 19 28 27 31 30 25 18 15 24 28 29 25 29 24 22 24 24 19 24 27 28 24 26 29 24 ]
#
func validcc iban$ .
c$ = substr iban$ 1 2
for i to len cc$[]
if c$ = cc$[i]
return if len iban$ = ln[i]
.
.
return 0
.
func mod97 s$ .
while s$ <> ""
h$ = r div 10
h$ &= r mod 10
h$ &= substr s$ 1 13
s$ = substr s$ 14 9999
r = number h$ mod 97
.
return r
.
func isvalid hiban$ .
for c$ in strchars hiban$
c = strcode c$
if c > 32
if c >= 97 and c < 122
c -= 32
c$ = strchar c
elif c < 48 or c > 57 and c < 65 or c > 90
return 0
.
miban$ &= c$
.
.
if validcc miban$ = 0
return 0
.
for c$ in strchars substr miban$ 5 999 & substr miban$ 1 4
c = strcode c$
if c >= 65 and c <= 90
t$ &= (c - 55) div 10
t$ &= (c - 55) mod 10
else
t$ &= c$
.
.
return if mod97 t$ = 1
.
proc check s$ .
write s$ & " is "
if isvalid s$ = 1
print "valid"
else
print "not valid"
.
.
check "GB82 WEST 1234 5698 7654 32"
check "GB82WEST12345698765432"
check "gb82 west 1234 5698 7654 32"
check "GB82 TEST 1234 5698 7654 32"
check "GB82 WEST 1243 5698 7654 32"
check "GB82 west 1243 5698 7654 32"