2012-10-19 102 views
2

我有兩個數字類型的字符串,但結果出錯了。如何減去兩個數字串

$totalamount='41,305.33'; 
$normalamount='999.72'; 
echo $total=$totalamount-$normalamount; 

是否有任何其他方式來做到這一點或問題與我自己的代碼。

+0

您可能要失去'echo'或'$總='(取決於您是否要輸出的差或只是計算它)。由於賦值是一個表達式(基本上賦值給賦值),所以兩個都應該工作,但是在一個語句中執行這兩個操作都有點令人毛骨悚然。 – cHao

+1

如果您只是刪除逗號,它將按預期工作。看到我的答案。 – Ultimater

回答

2

錯誤的原因是該字符串上有逗號。

$totalamount = floatval(str_replace(',', '','41,305.33')); 
$normalamount = floatval(str_replace(',', '','999.72')); 
echo $total = $totalamount-$normalamount; 

順便說一句,doubleval() - 的floatval()

+0

請注意,鑄造到一個數字並不是絕對必要的 - PHP會爲你做這個數學的一部分。只有當你試圖減去物體或某物時才重要,並且在那個時候你的數學將會變得棘手。 – cHao

+0

@cHao我同意你的意見。我只是試圖展示如何鑄造也可以工作:)也許供將來參考。 –

+0

這裏沒有必要調用'floatval'。 – Ultimater

2

別名這裏是number_format()反向功能。

解決方案:

function number_unformat($number, $dec_point = '.', $thousands_sep = ',') { 
    return (float)str_replace(array($thousands_sep, $dec_point), 
           array('', '.'), 
           $number); 
} 

$totalamount = number_unformat('41,305.33'); 
$normalamount = number_unformat('999.72'); 
$total  = $totalamount - $normalamount; 
echo $total; 

輸出:

40305.61 
+0

PHP已經有這個功能http://de3.php.net/manual/en/class.numberformatter.php – MarcDefiant

+2

@Mogria是的,在5.3之後。 – Carlos

+1

沒有必要定義這樣一個複雜的函數來處理這樣一個簡單的操作。 – Ultimater

2

您因 '' 性格得到了錯誤的值,簡單地刪除它們......

$totalamount='41,305.33'; 
$normalamount='999.72'; 
echo (double)str_replace(',','',$totalamount)- 
    (double)str_replace(',','',$normalamount); 
+0

在我看來是最好的答案。 – Ultimater

+0

不在我的。這些數字變量仍然是格式化的字符串,所以下一次你想用它們操作時,你必須再次轉換它們。此外,在這些變量按照給定區域格式化的情況下,小數點可能不同。 – Carlos

+1

如果你不打算將變換存儲在一個變量中,那麼手動投射爲「double」缺乏意義。 – Carlos

1

您可以使用floatval()實現你在找什麼,但你需要從字符串中刪除「」:

$totalamount = str_replace(',' , '', '41,305.33'); 
$normalamount = '999.72'; 
echo $totalamount - $normalamount; 

// Writes: 40305.61 
+1

非常多餘。 'str_replace(',','','41,305.33') - '999.72''就可以做到。 –

+1

沒有必要浮動兩次。 – Ultimater

+0

感謝您的反饋。 – BenM

-1

只需刪除逗號,它按預期工作。 沒有必要手動將字符串轉換爲數字,因爲減號操作符會爲我們執行此操作。

<?php 
$totalamount='41305.33'; 
$normalamount='999.72'; 
echo $total=$totalamount-$normalamount; 

原因'41,305.33'-'999.72'結果-958.72是因爲PHP,只要它看到一個逗號,認爲有一個無效的數字,修剪掉剩餘的字符。因此,你留下了'41'-'999.72'這確實是-958.72

+1

這是絕對正確的,這是解釋爲什麼會發生這種情況的唯一答案。爲什麼downvotes?! +1來計數行爲。 –

+0

@Alix:我想猜測它被低估了,因爲「我有這個數據給我的問題......」的正確答案不是「使用不同的數據」。如果不是爲了解釋,這實際上是一個無法回答的問題。數據可能來自數據庫或其他東西。 (我的意思是,在41305.33更好的情況下,誰真的用真實代碼輸入'41,305.33'?這顯然是一個很小的例子。)用一些代碼將答案轉換爲「invalid 「數據轉化爲有用的東西(就像'str_replace'的例子那樣)。 – cHao

-1

則可以將格式化的數字轉換爲數字PHP懂得使用NumberFormatter

$fmt = numfmt_create('de_DE', NumberFormatter::DECIMAL); 
echo $total = $fmt->parse('41,305.33') - $fmt->parse('999.72');