PHP仅显示重要(非零)小数

时间:2011-03-25 08:03:23

标签: php numbers

在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功能来实现这一目标的方法。我可以编写一个能够自己轻松完成此功能的函数,所以请保持这样的答案。

11 个答案:

答案 0 :(得分: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

答案 1 :(得分: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”

答案 2 :(得分:5)

不应该吗?:

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

PHP preg_replace语法是

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

答案 3 :(得分:3)

如果您需要内置解决方案并且使用的是4.2之后的PHP版本,则可以尝试floatval()

echo floatval(9.200);

打印

9.2

但是

echo floatval(9.123);

打印

9.123

希望这有帮助。

答案 4 :(得分:2)

尾随零 显着:

  • 值9.0表示实际值大于8.9且小于9.1
  • 值为9.00000表示实际值大于8.99999且小于9.00001

因此,您的要求非常不寻常。这就是为什么没有功能可以做你想做的事情的原因。

答案 5 :(得分: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

答案 6 :(得分: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/>";

}

答案 7 :(得分:0)

怎么样

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

答案 8 :(得分:0)

假设数字被编码为或转换为字符串,这是一个通用的方法:

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

答案 9 :(得分:-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

答案 10 :(得分:-2)

  

rtrim($ value,“0”)几乎可以工作。 rtrim的问题在于它将9.000作为9。

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