Validate International Securities Identification Number: Difference between revisions

Added Wren
(→‎{{header|Haskell}}: Tidied the second variant)
(Added Wren)
Line 2,831:
AU0000VXGZA3 is valid
FR0000988040 is valid</pre>
 
=={{header|Wren}}==
{{libheader|Wren-str}}
{{libheader|Wren-trait}}
{{libheader|Wren-fmt}}
The Luhn test method is reproduced here for convenience.
<lang ecmascript>import "/str" for Char
import "/trait" for Stepped
import "/fmt" for Conv, Fmt
 
var luhn = Fn.new { |s|
s = s[-1..0]
var s1 = Stepped.new(s, 2).reduce(0) { |sum, d| sum + d.bytes[0] - 48 }
var s2 = Stepped.new(s[1..-1], 2).reduce(0) { |sum, d|
var d2 = (d.bytes[0] - 48) * 2
return sum + ((d2 > 9) ? d2%10 + 1 : d2)
}
return (s1 + s2)%10 == 0
}
 
var isin = Fn.new { |s|
if (!(s is String && s.count == 12)) return false
for (i in 0..11) {
var c = s[i]
if (i <= 1) {
if (!Char.isUpper(c)) return false
} else if (i >= 2 && i <= 10) {
if (!Char.isUpper(c) && !Char.isDigit(c)) return false
} else {
if (!Char.isDigit(c)) return false
}
}
var dec = ""
for (i in 0...s.count) dec = dec + "%(Conv.atoi(s[i], 36))"
return luhn.call(dec)
}
 
var tests = [
"US0378331005", "US0373831005", "U50378331005", "US03378331005",
"AU0000XVGZA3", "AU0000VXGZA3", "FR0000988040"
]
 
for (test in tests) {
var ans = (isin.call(test)) ? "valid" : "not valid"
System.print("%(Fmt.s(-13, test)) -> %(ans)")
}</lang>
 
{{out}}
<pre>
US0378331005 -> valid
US0373831005 -> not valid
U50378331005 -> not valid
US03378331005 -> not valid
AU0000XVGZA3 -> valid
AU0000VXGZA3 -> valid
FR0000988040 -> valid
</pre>
 
=={{header|Yabasic}}==
9,476

edits