- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要能够根据他们的校验位来验证 CUSIP 号码。多亏了维基百科,我有了这个过程的伪代码,但到目前为止我还无法在 PHP 中复制它。
可以找到伪代码here .
我的PHP:
<?php
/**
* function to return the check digit value of a cusip
* @param $cusip
* the cusip for processing.
* @return Int
* cusip check digit.
*/
function cusip_checksum($cusip){
$sum = 0;
$rebuiltcusip = '';
for($i = 1; $i <= 8; $i++){
$c = substr($cusip, ($i - 1), 1); //$i needs to be 0, so as we start at 1, take 1 off.
$rebuiltcusip .= $c;
switch(true){
case $c == '0': // ctype_digit(0) returns false, so checking for 0 here.
$v = $c;
watchdog("case 0: ", $v);
break;
case ctype_digit($c): //check if numeric
$v = $c;
watchdog("case ctype_digit: ", $v);
break;
case $c == '*':
$v = 36;
watchdog("case *: ", $v);
break;
case $c == '@':
$v = 37;
watchdog("case @: ", $v);
break;
case $c == '#':
$v = 38;
watchdog("case #: ", $v);
break;
case !ctype_digit($c): //check letter last as this check would pass with * @ or # so allow them to be checked first
$v = (ord($c) - 64) + 9; //set ordinal number, -64 as this returns ASKII value, then add 9.
watchdog("case not ctype_digit: ", $v);
break;
}
if(($i % 2) == 0){ //check if odd
$v = $v * 2;
watchdog("case odd: ", $v);
}
$sum = $sum + ($v / 10) + ($v % 10);
watchdog("sum end loop: ", $sum);
}
$ncd = (10 - ($sum % 10)) % 10;
$rebuiltcusip .= $ncd;
watchdog("rebuilt cusip: ", "Cusip: ".$cusip." Rebuilt: ".$rebuiltcusip);
return $ncd;
}
?>
watchdog 只是我记录过程。
传入校验位值为 8 的 CUSIP:98986T108,实际返回值为 98986T104(校验位值为 4)。
所以:
<?php
print cusip_checksum('98986T108');
?>
应该返回 8,它返回 4。
有人能找出原因吗?
最佳答案
将除法包装在 floor() 函数中,您就在那里:
$sum = $sum + floor($v / 10) + ($v % 10);
现在 CUSIP 中的 Q 的值为 26。这会将 2 和 6 添加到 $sum 而不是添加 2.6 和 6。
这是经过更正的最终函数。我已经通过路透社提取的 17614 个 CUSIP 运行了这个,有 11 个不匹配。这是我通常从路透社数据中看到的错误级别,因此我对例程有信心。
/**
* function to return the check digit value of a cusip
* @param $cusip
* the cusip for processing.
* @return Int
* cusip check digit.
*/
function cusip_checksum($cusip){
$sum = 0;
$rebuiltcusip = '';
for($i = 1; $i <= 8; $i++){
$c = substr($cusip, ($i - 1), 1); //$i needs to be 0, so as we start at 1, take 1 off.
$rebuiltcusip .= $c;
switch(true){
case $c == '0': // ctype_digit(0) returns false, so checking for 0 here.
$v = $c;
watchdog("case 0: ", $v);
break;
case ctype_digit($c): //check if numeric
$v = $c;
watchdog("case ctype_digit: ", $v);
break;
case $c == '*':
$v = 36;
watchdog("case *: ", $v);
break;
case $c == '@':
$v = 37;
watchdog("case @: ", $v);
break;
case $c == '#':
$v = 38;
watchdog("case #: ", $v);
break;
case !ctype_digit($c): //check letter last as this check would pass with * @ or # so allow them to be checked first
$v = (ord($c) - 64) + 9; //set ordinal number, -64 as this returns ASKII value, then add 9.
watchdog("case not ctype_digit: ", $v);
break;
}
if(($i % 2) == 0){ //check if odd
$v = $v * 2;
watchdog("case odd: ", $v);
}
$sum = $sum + floor($v / 10) + ($v % 10);
watchdog("sum end loop: ", $sum);
}
$ncd = (10 - ($sum % 10)) % 10;
$rebuiltcusip .= $ncd;
watchdog("rebuilt cusip: ", "Cusip: ".$cusip." Rebuilt: ".$rebuiltcusip);
return $ncd;
}
关于PHP CUSIP 校验码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21828443/
我的数据库是这样的: Firm Agreement id Year Cusip_focal participants_cusips Abbott Lab 3947
我需要能够根据他们的校验位来验证 CUSIP 号码。多亏了维基百科,我有了这个过程的伪代码,但到目前为止我还无法在 PHP 中复制它。 可以找到伪代码here . 我的PHP: watchd
如果CUSIP定义为 A CUSIP is a 9-character alphanumeric code which identifies a North American financial se
CUSIP 是一个 9 位字母数字代码,用于唯一标识金融证券。 https://en.wikipedia.org/wiki/CUSIP 它们发明于1964年,考虑到60年代数据传输的可靠性,第9位实际
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我的工作场所不允许我们安装任何模块,因此该选项不适合我。所以决定看看这个链接http://en.wikipedia.org/wiki/CUSIP并按照那里的伪代码尝试用 Perl 编写代码。 我想出了
当我将 bdp 与 ISIN 或 CUSIP 一起使用时,出现以下错误。 bdp ("US25470XAB10 ISIN","ULT_PARENT_TICKER_EXCHANGE") bdp ("25
问题:我得到了一系列未指定类型的仪器的 ISIN。在 Bloomberg Excel API 中,这没有问题;例如,我可以输入 =BDP("CA5054401156 ISIN", "NAME"),然后
如何将 9 位 CUSIP 代码转换为 ISIN 代码(最好是在 Excel 中)? 最佳答案 CUSIP 完全包含在 ISIN 中。然后,ISIN 以 2 个字母为前缀(在本例中为“US”或“CA”
我是一名优秀的程序员,十分优秀!