让我们再试一次,但更明确一点。
我正在将数字打印到屏幕上,并希望通过去除小数点后的尾随零来使它们对用户更友好。我尝试过转换为浮点数,但这个解决方案不太合适,因为我处理像 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;