繁体   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