PHP show only significant (non-zero) decimals

2020-03-09 06:52发布

In PHP (using built-in functions) I'd like to convert/format a number with decimal, so that only the non-zero decimals show. However, another requirement of mine is that if it's a number without a decimal value, I'd still like to show that zero. Examples:

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

rtrim($value, "0") almost works. The problem with rtrim is that it leaves 9.000 as 9.. sprintf() seemed like a candidate, but I couldn't get it to have a variable amount of decimals. number_format() serves a different purpose, and those were all I could come up with...

Again, I'd like to point out that I am not looking for your homemade solutions to this, I'm looking for a way to accomplish this using internal PHP functionality. I can write a function that will accomplish this easily myself, so hold answers like that.

标签: php numbers
11条回答
Animai°情兽
2楼-- · 2020-03-09 07:35

Out of the box that isn't possible because you have two different ways of treating the fragment of your floats. You'll first have to determine how many non-zero numbers there are in your fragment and then act accordingly with 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/>";

}
查看更多
够拽才男人
3楼-- · 2020-03-09 07:35

Assuming the number is encoded as or cast to a string, here's a general purpose approach:

$value = is_numeric($value) ? strval($value + 0) : $value;
查看更多
别忘想泡老子
4楼-- · 2020-03-09 07:37

try something like this

$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);
    }

will display "2"

查看更多
我只想做你的唯一
5楼-- · 2020-03-09 07:38

If you want a built-in solution and you're using a PHP version later than 4.2 you could try floatval():

echo floatval(9.200);

prints

9.2

but

echo floatval(9.123);

prints

9.123

Hope this helps.

查看更多
可以哭但决不认输i
6楼-- · 2020-03-09 07:43

Shouldn't it be?:

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

The PHP preg_replace syntax is

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
查看更多
狗以群分
7楼-- · 2020-03-09 07:43
<?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
        );
    }
?>

Output:

9.000 -> 9.0
9.100 -> 9.1
9.120 -> 9.12
9.123 -> 9.123
查看更多
登录 后发表回答