Validate International Securities Identification Number: Difference between revisions

Added Rust
m (→‎{{header|VBScript}}: A correction)
(Added Rust)
Line 2,155:
# => [true, false, false, false, true, true, true]</lang>
 
=={{header|Rust}}==
 
<lang Rust>extern crate luhn_cc;
 
use luhn_cc::compute_luhn;
 
fn main() {
assert_eq!(validate_isin("US0378331005"), true);
assert_eq!(validate_isin("US0373831005"), false);
assert_eq!(validate_isin("U50378331005"), false);
assert_eq!(validate_isin("US03378331005"), false);
assert_eq!(validate_isin("AU0000XVGZA3"), true);
assert_eq!(validate_isin("AU0000VXGZA3"), true);
assert_eq!(validate_isin("FR0000988040"), true);
}
 
fn validate_isin(isin: &str) -> bool {
// Preliminary checks to avoid working on non-ASCII stuff
if !isin.chars().all(|x| x.is_alphanumeric()) || isin.len() != 12 {
return false;
}
if !isin[..2].chars().all(|x| x.is_alphabetic())
|| !isin[2..12].chars().all(|x| x.is_alphanumeric())
|| !isin.chars().last().unwrap().is_numeric()
{
return false;
}
 
// Converts the alphanumeric string in a numeric-only string
let bytes = isin.as_bytes();
 
let s2 = bytes.iter()
.flat_map(|&c| {
if c.is_ascii_digit() {
vec![c]
}
else {
(c + 10 - ('A' as u8)).to_string().into_bytes()
}
}).collect::<Vec<u8>>();
 
let string = std::str::from_utf8(&s2).unwrap();
let number = string.parse::<usize>().unwrap();
 
return compute_luhn(number);
}
</lang>
 
=={{header|SAS}}==
Line 2,205 ⟶ 2,253:
;
run;</lang>
 
=={{header|Scala}}==
{{Out}}Best seen running in your browser either by [https://scalafiddle.io/sf/D9ax4Js/0 ScalaFiddle (ES aka JavaScript, non JVM)] or [https://scastie.scala-lang.org/yOymYqoPSEeA7K7rjgn65g Scastie (remote JVM)].