2011-08-04 77 views
3

下面的代碼給了我兩個不同的輸出:爲什麼我的號碼值使用number_format()更改?

$number = '1562798794365432135246'; 
echo $number; 
echo number_format($number); 

任何人都可以解釋一下嗎?

編輯:忘記提及,上面給我「1562798794365432135246 1,562,798,794,365,432,233,984」。請注意,最後六位數字完全不同,因爲沒有明顯的原因(我要求它做的是插入千位分隔符)。

+1

你有什麼輸出。 – Chandresh

+0

關於倒票,我希望人們真正閱讀問題標題的內容:「爲什麼數字VALUE改變..」。我很清楚,number_format()添加逗號,它是我的意圖,但VALUE正在改變(最後六位數字)。即使PHP有一個整數限制,你也會期望整個數值變成最大INT。相反,只有最後六位數字會受到影響。 – lasavior

+1

我的猜測是你的數字太大而不適合int,並且被轉換爲浮點數。這會導致您看到的精度損失。 – NullUserException

回答

5

number_format()as stated by the PHP manual,浮法轉換爲具有數千組字符串用逗號。

$number = '1562798794365432135246'; 
var_dump($number); // string(22) "1562798794365432135246" 
var_dump(number_format($number)); // string(29) "1,562,798,794,365,432,233,984" 

如果你想將一個字符串轉換爲一個整數,你可以這樣做是這樣的:

$number = (int) $number; 

但是,要小心,因爲在PHP最大可能的整數值爲2147483647上一個32位系統和一個64位系統上的9223372036854775807。如果您嘗試在32位系統上將類似上面的字符串轉換爲int,則將$number指定爲2147483647,而不是您想要的值!

number_format()功能需要浮點數作爲參數,它有類似的問題。當您將字符串作爲參數傳遞給number_format()時,它將在內部轉換爲浮點型。浮點數比整數要複雜一點。而不是像一個整數值硬上限,浮點數逐漸失去精度在最低有效位數,使最後幾個地方不正確。

所以,不幸的是,如果您需要像這樣格式化長字符串,您可能需要編寫自己的函數。如果您只需要在千位上添加逗號,這應該很簡單 - 只需使用strlensubstr從字符串末尾獲取每個三個字符集,然後用逗號間隔創建一個新字符串。

+0

儘管我們在這裏討論PHP,所以鑄造可能是無用的。 – NullUserException

+0

通常,是的。 :) –

+1

與'number_output()'混淆了,不應該是'number_format'嗎? – tradyblix

2

我知道這是一個老問題,但最近我遇到了這個問題,並編寫了一個適用於我的目的的函數。希望它可以幫助別人。它適用於單引號字符串和$ _GET。我沒有測試過$ _POST。如果您正在處理負整數或非整數,則必須進行修改。

<?php 
function format_big_numbers($number, $delimiter) { 
$len = strlen($number); 
if ($len > 3){ 
    if ($len % 3 == 0) { 
     $split = str_split($number, 3); 
     $number_with_commas = implode("$delimiter", $split); 
     return $number_with_commas; 
    } 
    else if ($len % 3 == 1) { 
     $front = substr($number, 0, 1); 
     $split = substr($number, 1, $len - 1); 
     $split = str_split($split, 3); 
     $number_with_commas = implode("$delimiter", $split); 
     $number_with_commas = $front . "$delimiter" . $number_with_commas; 
     return $number_with_commas; 
    } 
    else { 
     $front = substr($number, 0, 2); 
     $split = substr($number, 2, $len - 2); 
     $split = str_split($split, 3); 
     $number_with_commas = implode("$delimiter", $split); 
     $number_with_commas = $front . "$delimiter" . $number_with_commas; 
     return $number_with_commas; 
    } 
} 
else { 
    return $number; 
} 
} 
$num = '1234567891234567891234567891234'; 
echo format_big_numbers($num, ","); // output is 1,234,567,891,234,567,891,234,567,891,234 
?> 
相關問題