修剪尾随零而不强制转换为浮点数


Trimming trailing zeros WITHOUT casting to float

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

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

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

12.02000000
12.00000000
0.00000001

。可以打印到屏幕上,如...

12.02
12
0.00000001

使用 rtim 会杀死像 10000 这样的数字。 number_format需要知道小数位数,可能是从 0 到 8。铸造到浮动不起作用。我敢肯定有一些正则表达式。

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

$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

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

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

在互联网上搜索了一番后,我发现了一些可能有用的东西:

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

我想这将为您提供所需的输出

我在这里找到

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

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

三元运算符样式:

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