如何在PHP中删除尾随零

nhu*_*ton 63 php string

嗨,任何人都可以给我一个解释(也许是一个例子),我将如何使用PHP从数字中删除尾随的零.

例如:

"Lat":"37.422005000000000000000000000000","Lon":"-122.84095000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)

将转入:

"Lat":"37.422005","Lon":"-122.84095"
Run Code Online (Sandbox Code Playgroud)

我试图剥离零,使其更具可读性.我尝试使用str_replace()但是这也取代了数字中的零(doh).

谢谢= D

Rob*_*itt 119

忘记所有的rtrims,正则表达式,坐标是浮点数,应该被视为浮点数,只需将变量前置为(float)从字符串转换为浮点数:

$string = "37.422005000000000000000000000000";
echo (float)$string;
Run Code Online (Sandbox Code Playgroud)

输出:

37.422005
Run Code Online (Sandbox Code Playgroud)

您拥有的实际结果是浮点数,但由于HTTP协议而作为字符串传递给您,最好将它们转换回自然形式以进行计算等.

测试用例:http://codepad.org/TVb2Xyy3

注意:关于PHP中浮点精度的注释,请参阅:https://stackoverflow.com/a/372​​6761/353790

  • 解决方案不好 浮子的精度有限; 这可以截断有效数字. (22认同)
  • 我想如果数字是"0.0000085"那些不会有用,结果会像"8.5E-5" (4认同)
  • 我认为这不是一个糟糕的解决方案,我认为这是该语言的更好解决方案之一,如果OP需要精度,那么OP应该考虑使用支持有限精度的C,C#,Python等. (3认同)
  • 错误的答案.. 如果数字有千位分隔符,则失败 (3认同)
  • 大声笑,伙计,只需将字符串添加到0($ a + = 0;)...你的答案开始的方式我认为你比其他人更好 (2认同)

jwe*_*ich 30

尝试使用rtrim:

$number = rtrim($number, "0");
Run Code Online (Sandbox Code Playgroud)

如果您有一个终止于0的十进制数(例如123.000),您可能还想删除小数分隔符,根据使用的区域设置,它可能会有所不同.要可靠地删除它,您可以执行以下操作:

$number = rtrim($number, "0");
$locale_info = localeconv();
$number = rtrim($number, $locale_info['decimal_point']);
Run Code Online (Sandbox Code Playgroud)

这当然不是防弹解决方案,可能不是最好的解决方案.如果您有一个类似12300.00的数字,它不会从整数部分删除尾随的0,但您可以根据您的特定需要进行调整.

  • 在我的情况下,我做了以下:rtrim(rtrim($ number,"0"),".")因为如果显示整数,我也必须删除小数(例如,这将显示数字2.00, 1.00,28.50,16.25我想显示为2,1,28.5,16.25,而不是2.,1.,28.5,16.25) (18认同)
  • 我喜欢这个解决方案,因为你可以保留用 number_format 插入的逗号: rtrim(rtrim(number_format($number, 2), '0'), '.') 在我的情况下,我不需要担心像 100 这样的整数,因为我从数据库中提取一个十进制值。 (2认同)

Oko*_*000 25

如果你尝试修剪或其他字符串操作,你会遇到很多麻烦.试试这种方式.

$string = "37.422005000000000000000000000000";

echo $string + 0;
Run Code Online (Sandbox Code Playgroud)

输出:

37.422005
Run Code Online (Sandbox Code Playgroud)

  • 优秀的解决方 知道这是如何工作的吗?因为它确实有效 (2认同)
  • 这很简单。您从一个带有很多尾随零的字符串开始。PHP 无法将整数“0”添加到字符串中,因此它首先将字符串转换为数字类型,然后添加“0”。你最终得到一个数字,而不是一个字符串。数字类型没有用于尾随零。您应该小心自动类型转换,但在这种情况下,它是完全可预测和安全的。 (2认同)

Far*_*ray 7

你也可以使用floatval(val);.

 <?php
 echo floatval( "37.422005000000000000000000000000" );
 ?>
Run Code Online (Sandbox Code Playgroud)

结果是

37.422005

  • 我不认为这首先是最好的选择,但是,如果您要转换为浮点数,请不要使用 `floatval()`。只需将其转换为带有 `(float)` 的浮点数。如果可能,请始终避免调用额外的函数。`floatval()` 的用例是当你想将整个数组的值转换为浮点数时,你可以调用 `array_map('floatval', $someArray);` (2认同)
  • `floatval` 和 `(float)` 都将我的数字转换为科学记数法 `.0E-7` (2认同)

War*_*ent 7

就我而言,我执行了以下操作,并在此处扩展了其他答案:

rtrim((strpos($number,".") !== false ? rtrim($number, "0") : $number),".");
Run Code Online (Sandbox Code Playgroud)

因为如果显示整数,我还必须删除小数

例如,这将显示以下数字

2.00, 1.00, 28.50, 16.25 
Run Code Online (Sandbox Code Playgroud)

作为

2, 1, 28.5, 16.25
Run Code Online (Sandbox Code Playgroud)

而不是

2., 1., 28.5, 16.25
Run Code Online (Sandbox Code Playgroud)

对我来说,这没有正确显示它们。

最新编辑还通过仅在遇到小数时修剪最右边的 0 来阻止诸如“100”之类的数字被 rtrim'ed 为 1。

  • 将在诸如“100”之类的数字上失败(去掉重要的 0)。 (2认同)

小智 6

如果您想从末尾去除多余的零,但只去除到特定的小数位,这是一个有用的表达式来实现这一点(例如 0.30000 将显示 0.30,0.0003000 将显示 0.0003)。

preg_replace("/(?<=\\.[0-9]{2})[0]+\$/","",$number);
Run Code Online (Sandbox Code Playgroud)

当然,{2} 控制小数位数限制。

  • +1 使用最复杂的方法来解决简单的问题:-) (10认同)

mpe*_*pen 5

这些解决方案中的大多数都将修剪数字中的有效数字,例如“ 100”(无尾随十进制)。这是一个没有问题的简单解决方案:

function TrimTrailingZeroes($nbr) {
    if(strpos($nbr,'.')!==false) $nbr = rtrim($nbr,'0');
    return rtrim($nbr,'.') ?: '0';
}
Run Code Online (Sandbox Code Playgroud)

我认为这涵盖了所有不同的情况。

>>> TrimTrailingZeroes('0')
=> "0"
>>> TrimTrailingZeroes('01')
=> "01"
>>> TrimTrailingZeroes('01.0')
=> "01"
>>> TrimTrailingZeroes('01.01')
=> "01.01"
>>> TrimTrailingZeroes('01.010')
=> "01.01"
>>> TrimTrailingZeroes('.0')
=> "0"
>>> TrimTrailingZeroes('.1')
=> ".1"
>>> TrimTrailingZeroes('.10')
=> ".1"
>>> TrimTrailingZeroes('3141592653589793.238462643383279502880000000000000000000000000000')
=> "3141592653589793.23846264338327950288"
Run Code Online (Sandbox Code Playgroud)