我找到了这个wiki页面:IBAN
我遵循这样的步骤:
$iban = 'GB82WEST12345698765432';
$bankname = substr($iban, 0, 4);
$accountnumber = substr($iban, 4);
$country = $this->convertToNumber($bankname);
$number = ($accountnumber . $country);
$area = substr($number, 0, 4);
$accountnumber = substr($number, 4);
$number = $this->convertToNumber($area) . $accountnumber;
var_dump('3214282912345698765432161182');
var_dump($number);所以现在我有了和这个例子相同的数字。产出:
string 'GB82WEST12345698765432' (length=22)
string '3214282912345698765432161182' (length=28)
string '3214282912345698765432161182' (length=28)如果我现在做了,3214282912345698765432161182 mod 97 = 1
var_dump($number % 97);我明白了:int 78
结果是1。我做错什么了?
发布于 2014-01-12 17:31:28
不幸的是,PHP很难处理大量的数据。您所需要的只是将数字存储为任意数字,并使用适当的PHP功能。请查一下BCMath。这个例子很清楚:
php > var_dump(bcmod('3214282912345698765432161182',(int)97));
string(1) "1"考虑到这一点,您应该将这个巨大的数字作为一个字符串传递,这样PHP就不会破坏它,在这种情况下,结果将是"1",如果您要将这个巨大的数字作为int传递--它将在到达bcmod()之前变成浮点,最后您将收到"0“。
发布于 2014-01-12 17:29:03
wiki为langague提供了一个不支持大数的alogrithm (它需要220位整数):
在php works中对此进行编码,结果为1。
<?php
$iban = "3214282912345698765432161182";
$first = substr($iban, 0, 9);
$array = str_split(substr($iban, 9),7);
$result = $first % 97;
foreach ($array as &$value) {
$result = intval( strval($result) . $value) % 97;
}
if ($result == 1) {
echo "IBAN:$iban is valid";
} else {
echo "IBAN:$iban invalid remainder:$result";
}
?>运行测试:http://ideone.com/1XNE2b
IBAN:3214282912345698765432161182有效
https://stackoverflow.com/questions/21077360
复制相似问题