September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
59
Task/IBAN/Phix/iban.phix
Normal file
59
Task/IBAN/Phix/iban.phix
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
--
|
||||
-- demo\rosetta\IBAN.exw
|
||||
-- =====================
|
||||
--
|
||||
constant nations = {{"AD",24}, -- Andorra
|
||||
-- (full list in distro)
|
||||
{"CH",21}, -- Switzerland
|
||||
{"GB",22}, -- United Kingdom
|
||||
{"SA",24}, -- Saudi Arabia
|
||||
{"XK",20}} -- Kosovo
|
||||
|
||||
constant {countries,lengths} = columnize(nations)
|
||||
|
||||
function iban(string code)
|
||||
-- This routine does and should reject codes containing spaces etc.
|
||||
-- Use iban_s() below for otherwise.
|
||||
integer country = find(code[1..2],countries)
|
||||
if country!=0
|
||||
and length(code)=lengths[country] then
|
||||
code = code[5..$]&code[1..4]
|
||||
integer c = 0
|
||||
for i=1 to length(code) do
|
||||
integer ch=code[i]
|
||||
if ch>='0' and ch<='9' then
|
||||
c = c*10+ch-'0'
|
||||
elsif ch>='A' and ch<='Z' then
|
||||
c = c*100+ch-55
|
||||
else
|
||||
return false
|
||||
end if
|
||||
c = mod(c,97)
|
||||
end for
|
||||
return c=1
|
||||
end if
|
||||
return false
|
||||
end function
|
||||
|
||||
function iban_s(string code)
|
||||
-- strips any embedded spaces and hyphens before validating.
|
||||
code = substitute_all(code,{" ","-"},{"",""})
|
||||
return iban(code)
|
||||
end function
|
||||
|
||||
procedure test(string code, bool expected)
|
||||
bool valid = iban_s(code)
|
||||
string state
|
||||
if valid=expected then
|
||||
state = iff(valid?"ok":"invalid (as expected)")
|
||||
else
|
||||
state = iff(valid?"OK!!":"INVALID!!")&" (NOT AS EXPECTED)"
|
||||
end if
|
||||
printf(1,"%-34s :%s\n",{code,state})
|
||||
end procedure
|
||||
|
||||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue