34 lines
1.3 KiB
Text
34 lines
1.3 KiB
Text
go =>
|
|
IBAN = "GB82 WEST 1234 5698 7654 32",
|
|
println(IBAN=iban(IBAN)),
|
|
nl.
|
|
|
|
iban(IBAN) = Ret =>
|
|
nations(Nations),
|
|
Ret = [],
|
|
IBAN2 = IBAN.delete_all(' ').to_uppercase(),
|
|
Len = IBAN2.length,
|
|
Len > 2, % sanity check
|
|
if Len != Nations.get(slice(IBAN2,1,2),0).to_integer() then
|
|
Ret := ["wrong country length"]
|
|
end,
|
|
IBAN3 = slice(IBAN2,5,Len) ++ slice(IBAN2,1,4),
|
|
if [convert(C) : C in IBAN3].join('').to_integer() mod 97 != 1 then
|
|
Ret := Ret ++ ["bad mod"]
|
|
end,
|
|
if Ret == [] then Ret := "ok" end.
|
|
|
|
|
|
% convert char: 1=1,...9=9, A=10, B=11,Z=35
|
|
convert(C) = cond(ord(C)-65 >= 0,ord(C)-55,ord(C)-48).to_string().
|
|
|
|
% Lengths for different nations.
|
|
nations(Nations) =>
|
|
Nations = new_map(
|
|
["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]).
|