2

让我们再试一次,但更明确一点。

我正在将数字打印到屏幕上,并希望通过去除小数点后的尾随零来使它们对用户更友好。我曾尝试转换为浮点数,但这个解决方案并不适合,因为我处理像 0.00000001 这样的数字,这些数字是 0.1-e7 之类的东西,对最终用户不友好。

我需要一个解决方案,其中数字如下...

12.02000000
12.00000000
0.00000001

...可以像...一样打印到屏幕上

12.02
12
0.00000001

使用 rtim 会杀死像 10000 这样的数字。 number_format 需要知道可能从 0 到 8 的小数位数。转换为浮点数不起作用。我确信这有一些正则表达式。

4

4 回答 4

3

这是您想要的正则表达式解决方案:

$repl = preg_replace('/(?>\.0+$|(\.\d*[^0])0+$)/', '$1', $numstr);

测试:

echo preg_replace('/(?>\.0+$|(\.\d*[^0])0+$)/', '$1', '12.02000000') . "\n";
echo preg_replace('/(?>\.0+$|(\.\d*[^0])0+$)/', '$1', '12.00000000') . "\n";
echo preg_replace('/(?>\.0+$|(\.\d*[^0])0+$)/', '$1', '0.0000000100000000') . "\n";
echo preg_replace('/(?>\.0+$|(\.\d*[^0])0+$)/', '$1', '100000000') . "\n";

输出:

12.02
12
0.00000001
100000000
于 2013-10-10T13:47:52.793 回答
1

一个稍微简单的解决方案:

preg_replace("/(\.0*[^0]+)0*|\.0*/", '\1', $number)
于 2013-10-10T13:58:29.420 回答
0

在网上搜索了一下后,我发现了一些有用的东西:

function floattostr( $val )
{
    preg_match( "#^([\+\-]|)([0-9]*)(\.([0-9]*?)|)(0*)$#", trim($val), $o );
    return $o[1].sprintf('%d',$o[2]).($o[3]!='.'?$o[3]:'');
}

我猜这会给你你需要的输出

我在这里找到

于 2013-10-10T13:50:46.530 回答
0

这是一种非正则表达式的方法:

if (strpos($number, '.') !== false) {
    $number = rtrim($number, '.0');
}

三元运算符风格:

$number = strpos($number, '.') !== false ? rtrim($number, '.0') : $number;
于 2013-10-10T14:23:40.467 回答