簡體   English   中英

PHP僅顯示重要(非零)小數

[英]PHP show only significant (non-zero) decimals

在PHP中(使用內置函數)我想轉換/格式化一個帶小數的數字,這樣只顯示非零小數。 然而,我的另一個要求是,如果它是一個沒有小數值的數字,我仍然希望顯示為零。 例子:

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

rtrim($value, "0")幾乎可以工作。 rtrim的問題是它留下9.0009. sprintf()似乎是一個候選者,但我不能讓它有一個可變的小數位數。 number_format()用於不同的目的,而這些都是我能想到的......

再次,我想指出我不是在尋找你自己的解決方案,我正在尋找一種使用內部PHP功能來實現這一目標的方法。 我可以編寫一個能夠自己輕松完成此功能的函數,所以請保持這樣的答案。

我不認為這是一種方法。 正則表達式可能是您最好的解決方案:

$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

嘗試這樣的事情

$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”

不應該嗎?:

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

PHP preg_replace語法是

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

如果你想要一個內置的解決方案並且你使用的是4.2之后的PHP版本,你可以嘗試使用floatval()

echo floatval(9.200);

版畫

9.2

echo floatval(9.123);

版畫

9.123

希望這可以幫助。

尾隨零重要的:

  • 值9.0表示實際值大於8.9且小於9.1
  • 值為9.00000表示實際值大於8.99999且小於9.00001

因此,您的要求非常不尋常。 這就是為什么沒有功能可以做你想要的事情的原因。

<?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

開箱即用是不可能的,因為你有兩種不同的方法來處理浮動片段。 您首先必須確定片段中有多少非零數字,然后使用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/>";

}

怎么樣

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

假設數字被編碼為或轉換為字符串,這是一個通用的方法:

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

我的解決方案是讓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

rtrim($ value,“0”)幾乎可以工作。 rtrim的問題在於它將9.000留作9。

所以只是rtrim($ value,“0”)而且你已經完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM