RosettaCodeData/Task/CUSIP/PHP/cusip.php

40 lines
1.2 KiB
PHP

function IsCusip(string $s) {
if (strlen($s) != 9) return false;
$sum = 0;
for ($i = 0; $i <= 7; $i++) {
$c = $s[$i];
if (ctype_digit($c)) {
// if character is numeric, get character's numeric value
$v = intval($c);
} elseif (ctype_alpha($c)) {
// if character is alphabetic, get character's ordinal position in alphabet
$position = ord(strtoupper($c)) - ord('A') + 1;
$v = $position + 9;
} elseif ($c == "*") {
$v = 36;
} elseif ($c == "@") {
$v = 37;
} elseif ($c == "#") {
$v = 38;
} else {
return false;
}
// is this character position even?
if ($i % 2 == 1) {
$v *= 2;
}
// calculate the checksum digit
$sum += floor($v / 10 ) + ( $v % 10 );
}
return ord($s[8]) - 48 == (10 - ($sum % 10)) % 10;
}
$cusips = array("037833100",
"17275R102",
"38259P508",
"594918104",
"68389X106",
"68389X105");
foreach ($cusips as $cusip) echo $cusip . " -> " . (IsCusip($cusip) ? "valid" : "invalid") . "\n";