2011-03-25 21 views
14

在PHP(使用內置函數)中,我想轉換/格式化一個十進制數,以便只顯示非零小數。但是,我的另一個要求是,如果它是一個沒有十進制值的數字,我仍然希望顯示爲零。例子:PHP只顯示重要的(非零)小數

9.000 -> 9.0 
9.100 -> 9.1 
9.120 -> 9.12 
9.123 -> 9.123 

rtrim($value, "0")差不多工作。 rtrim的問題是,它將9.000保留爲9.sprintf()看起來像一個候選人,但我不能讓它有一個可變數量的小數。 number_format()服務不同的目的,這些都是我可以拿出...

再次,我想指出,我不是在尋找你的自制解決方案,我正在尋找一種方式使用內部PHP功能完成此操作。我可以編寫一個能夠輕鬆完成這個任務的函數,所以請持有這樣的答案。

+2

是否的preg_replace()作爲內部PHP功能? – Kaivosukeltaja 2011-03-25 08:07:14

+0

從你所描述的,我認爲它相當於總是在小數點後面留下1個數字(「。」) – 2011-03-25 08:21:25

回答

7

我不認爲這是一種方法。一個正則表達式可能是你最好的解決辦法:

$value = preg_replace('/(\.[0-9]+?)0*$/', '$1', $value); 

演示:

php> $a = array('0.000', '0.0001', '0.0101', '9.000', '9.100', '9.120', '9.123'); 
php> foreach($a as $b) { echo $b . ' => ' . preg_replace('/(\.[0-9]+?)0*$/', '$1', $b)."\n"; } 
0.000 => 0.0 
0.0001 => 0.0001 
0.0101 => 0.0101 
9.000 => 9.0 
9.100 => 9.1 
9.120 => 9.12 
9.123 => 9.123 
+0

這不起作用,因爲「9.01」會變成「91」。需要一些分組! – 2011-03-25 08:18:17

+0

你把我放在正確的軌道上,雖然你的答案是無效的PHP(你的參數的順序是錯誤的)。使用preg_replace的正確方法是preg_replace('/(?<!\。)0 * $ /','',$ value)。所以謝謝你把我推向了正確的方向。我會給你答案,幫助我找到答案。 – Alex 2011-03-25 08:18:53

+0

我想你需要'preg_replace($ value'/ \。?0 * $ /','')'來處理像123.4500 – 2011-03-25 08:20:59

1

,因爲你有你的治療花車的片段的兩種不同的方式這是不可能的盒子。您首先必須確定片段中有多少個非零數字,然後使用sprintf進行相應處理。

<?php 

$numbers = array(
    '9.000', 
    '9.100', 
    '9.120', 
    '9.123', 
); 

foreach ($numbers as $number) { 

    $decimals = strlen(str_replace('0','', array_pop(explode('.', $number)))); 
    $decimals = $decimals ?: 1; 
    echo $number . " => " . sprintf("%.{$decimals}f", $number); 

    echo "<br/>"; 

} 
2

甲尾隨零顯著:

  • 的9.0的值所暗示的,該實際值大於8.9且小於9.1
  • 的9.00000的值所暗示的,該實際值超過8.99999且小於9.00001

因此,您的要求很不尋常。這就是爲什麼沒有功能來做你想做的事。

+2

回到基本.. – DhruvPathak 2011-03-25 08:17:04

+5

這是更多的顯示目的比科學的準確性。我知道這意味着什麼意思,這就是爲什麼我把「非零」放在括號內。我想我可以更好地回答我的問題。 – Alex 2011-03-25 08:17:07

+0

有效數字的規則也僅用於顯示目的。在計算過程中,使用最高的準確度。只有當最終結果應該顯示時,它纔會被舍入到足夠的準確度(以免暗示輸入從未有過的準確性)。 – Oswald 2011-03-25 08:28:09

5

它不應該是?:

$value = preg_replace('~0*$~', '', $value); 

的PHP的preg_replace語法

mixed preg_replace (mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]]) 
+0

+1,這是做OP要求的唯一解決方案。 – 2012-04-12 14:03:46

+0

無效9.120 – Thibault 2013-08-26 10:04:38

+0

@Thibault - 您的書寫'〜([。] [0-9])0 * $〜'太複雜請參閱編輯! – 2013-08-27 01:28:08

2
<?php 
    $numbers = array(
     "9.000", 
     "9.100", 
     "9.120", 
     "9.123" 
    ); 
    foreach($numbers as $number) { 
     echo sprintf(
      "%s -> %s\n", 
      $number, 
      (float) $number == (int) $number ? number_format($number, 1) : (float) $number 
     ); 
    } 
?> 

輸出:

9.000 -> 9.0 
9.100 -> 9.1 
9.120 -> 9.12 
9.123 -> 9.123 
-1

我的解決辦法是讓PHP處理它作爲一個數字(是* 1),然後將其視爲一個字符串(我的前充足的我是用存儲爲2位小數小數百分比):

printf('%s%% off', $value*1); 

此輸出:

0.00 => 0% off 
0.01 => 0.01% off 
20.00 => 20% off 
20.50 => 20.5% off 
+0

不回答提問 – Ren 2012-11-07 09:16:54

-2

RTRIM($值, 「0」)幾乎工程。 rtrim的問題是它將9.000保留爲9。

所以只是rtrim($ value,「0.」),你就完成了。

+1

-1,那麼'9.000'和'90.000'會變成'9'而不是'9.0'或'90.0'。 – 2012-04-12 14:02:41

+0

rtrim(rtrim($ value,「0」),「。」) – 2014-01-01 02:51:52

+0

另外$ value =(float)$ value也適用 – 2014-01-01 02:58:52

6

嘗試這樣的事情

$number = 2.00; 
echo floor_dec($number,$deg); 

    function floor_dec($number, $deg = null) 
    { 
     if ($deg == null) 
      return $number * 1000/1000; 
     else 
      return $number * pow(10, $deg)/pow(10, $deg); 
    } 

會顯示 「2」

0

如何

preg_replace(/\\.$/,'.0',rtrim($value,'0')) 
3

如果你想有一個內置的解決方案,你以後使用的PHP版本比4.2你可以試試floatval()

echo floatval(9.200); 

打印

9.2 

echo floatval(9.123); 

打印

9.123 

希望這有助於。

0

假設數字編碼爲或轉換爲字符串,這裏有一個通用的方法:

$value = is_numeric($value) ? strval($value + 0) : $value;