40 lines
1.2 KiB
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";
|