2014-01-12 26 views
0

我發現這個wiki頁面: http://en.wikipedia.org/wiki/IBAN#Validating_the_IBAN計算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。我做錯了什麼?

+1

大概php不處理大整數。這是在wiki中解釋的。在python中,結果是1.谷歌似乎http://pear.php.net/package/Math_BigInteger可以提供幫助嗎?順便說一句,維基解釋瞭如何用不含大整數的langague來計算modulo。 – mpromonet

+0

畢竟我使用從symfony2驗證的IBAN:http://symfony.com/doc/current/reference/constraints/Iban.html(> = Symfony2.3) –

回答

1

不幸的是,PHP不好處理龐大的數字。 您只需將該號碼存儲爲任意數字並使用正確的PHP功能即可。 請檢查BCMath。 的例子是明確的:

php > var_dump(bcmod('3214282912345698765432161182',(int)97)); 
string(1) "1" 

對於起見,你應該通過大量的字符串,使PHP不會打破了它,在這種情況下,結果將是「1」,如果你會以int的形式傳遞巨大的數字 - 在到達bcmod()之前它將變成浮動狀態,並且最終會收到「0」。

1

編碼是什麼在PHP作品維基描述(給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

+0

我該怎麼做這麼大的數字'/ 97'? –

+0

看來bcdiv是一個直接的解決方案http://us3.php.net/manual/fr/function.bcdiv.php – mpromonet