Validate International Securities Identification Number: Difference between revisions

added langur language example
(added langur language example)
Line 1,608:
FR0000988040 -> valid
</pre>
 
=={{header|langur}}==
The luhn test is repeated here for simplicity (from <a href="https://www.rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#langur">Luhn_test_of_credit_card_numbers#langur</a>).
 
<lang langur>val .luhntest = f(.s) {
val .t = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
val .numbers = map f .c-'0', s2cp .s
val .oddeven = len(.numbers) rem 2
 
foldfrom(
f(.sum, .i, .c) if .i rem 2 == .oddeven { .sum + .c } else { .sum + .t[.c+1] },
0,
series len .numbers,
.numbers,
) rem 10 == 0
}
 
val .isintest = f(.s) {
if val .base36 = match(re/^[A-Z][A-Z][0-9A-Z]{9}[0-9]$/, .s) {
val .base10 = join "", map f toNumber(cp2s(.c), 36), s2cp .base36
return .luhntest(.base10)
}
return false
}
 
val .tests = h{
"US0378331005": true,
"US0373831005": false,
"U50378331005": false,
"AU0000XVGZA3": true,
"AU0000VXGZA3": true,
"FR0000988040": true,
"US03378331005": false,
}
 
for .key in sort(keys .tests) {
val .pass = .isintest(.key)
write .key, ": ", .pass
writeln if(.pass == .tests[.key]: ""; " (ISIN TEST FAILED)")
}</lang>
 
{{out}}
<pre>AU0000VXGZA3: true
AU0000XVGZA3: true
FR0000988040: true
U50378331005: false
US03378331005: false
US0373831005: false
US0378331005: true</pre>
 
=={{header|Lua}}==
889

edits