在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功能来实现这一目标的方法。我可以编写一个能够自己轻松完成此功能的函数,所以请保持这样的答案。
答案 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)
尾随零 显着:
因此,您的要求非常不寻常。这就是为什么没有功能可以做你想做的事情的原因。
答案 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。”)而且你已经完成了。