修剪拖尾零,没有铸造浮动

时间:2013-10-10 13:42:06

标签: php regex

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

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

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

12.02000000
12.00000000
0.00000001

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

12.02
12
0.00000001

使用rtim会杀死10000之类的数字.number_format需要知道0到8之间的小数位数。转换为float不起作用。我确信这有一些正则表达式。

4 个答案:

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

答案 1 :(得分:1)

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

preg_replace("/(\.0*[^0]+)0*|\.0*/", '\1', $number)

答案 2 :(得分: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]:'');
}

这将为您提供我想要的输出

我找到了here

答案 3 :(得分:0)

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

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

三元运营商风格:

$number = strpos($number, '.') !== false ? rtrim($number, '.0') : $number;