Validate International Securities Identification Number: Difference between revisions
Content added Content deleted
(Added Dart) |
(Add bruijn) |
||
Line 601: | Line 601: | ||
{{out}} |
{{out}} |
||
<pre>Similar to FreeBASIC entry.</pre> |
<pre>Similar to FreeBASIC entry.</pre> |
||
=={{header|Bruijn}}== |
|||
Using bruijn's <code>luhn</code> solution from [[Luhn test of credit card numbers]]: |
|||
<syntaxhighlight lang="bruijn"> |
|||
:import luhn_test_of_credit_card_numbers . |
|||
:import std/Number/Conversion . |
|||
:import std/Combinator . |
|||
:import std/String . |
|||
:import std/Char . |
|||
:import std/Logic . |
|||
:import std/Number . |
|||
# verifies ISIN format |
|||
format? [len ⋀? country ⋀? security ⋀? checksum] |
|||
len (length 0) =? (+12) |
|||
country all? uppercase? (take (+2) 0) |
|||
security all? (φ or? uppercase? numeric?) (take (+9) (drop (+2) 0)) |
|||
checksum numeric? _0 |
|||
# performs luhn test |
|||
checksum? (map (from-base36 → number→string)) → concat → string→number → luhn |
|||
from-base36 binary→ternary → [(0 - (0 ≥? (+65) ((+65) - (+10)) (+48)))] |
|||
# performs format and checksum test |
|||
validate φ and? format? checksum? |
|||
:test (validate "US0378331005") (true) |
|||
:test (validate "US0373831005") (false) |
|||
:test (validate "U50378331005") (false) |
|||
:test (validate "US03378331005") (false) |
|||
:test (validate "AU0000XVGZA3") (true) |
|||
:test (validate "AU0000VXGZA3") (true) |
|||
:test (validate "FR0000988040") (true) |
|||
</syntaxhighlight> |
|||
=={{header|C}}== |
=={{header|C}}== |