从PHP中删除小数中无用的零位数字

193

我正在尝试寻找一种快速的方法,从像这样的数字值中删除零小数位

echo cleanNumber('125.00');
// 125

echo cleanNumber('966.70');
// 966.7

echo cleanNumber(844.011);
// 844.011

有没有一些优化的方法来做这件事?


4
由于您的值实际上是字符串,为什么不直接使用 rtrim() - http://www.php.net/manual/en/function.rtrim.php - 并以 '0.' 作为第二个参数呢? - Mark Baker
14
@Mark Baker: 这种方法不好,因为数字120会被截断为12。 - machineaddict
@machineaddict - 只有当字符串值没有小数点时才会这样..... OP 引用的所有字符串都有小数点。 - Mark Baker
3
那么,您应该在答案中添加一个加粗的提示,它只有在存在小数时才有效。 - machineaddict
在数学中,“无用的零”被称为“不显著数字”[维基百科](https://en.wikipedia.org/wiki/Significant_figures#Identifying_significant_figures)。 - Ethan
显示剩余2条评论
31个回答

408

$num + 0就可以搞定。

echo 125.00 + 0; // 125
echo '125.00' + 0; // 125
echo 966.70 + 0; // 966.7

在内部,这相当于使用 (float)$numfloatval($num) 将其转换为浮点数,但我觉得这更简单。


59
我认为这是一个卑鄙的手段。我不喜欢它,因为代码没有像 floatval() 一样告诉我们它的行为。 - Maik
5
floatval函数的行为是返回一个浮点数。我认为将其用作小数格式化工具既不明显也不干净。 - lafor
3
这段话很不清楚。我们的团队在代码中遇到了这个问题,三个开发人员苦思冥想了一段时间。我认为Mark的答案是一个更好的选择。虽然它更长,但意图更明确。 - jfbalanc
2
@jfbalanc //注释 - Positivity
2
@ESCOBAR 不是很准确,这是一种官方建议的类型转换方法... 在php.net上搜索“type juggling”。 - Gergely Lukacsy
显示剩余6条评论

130

你可以使用floatval函数。

echo floatval('125.00');
// 125

echo floatval('966.70');
// 966.7

echo floatval('844.011');
// 844.011

8
当千位分隔符为点号,小数分隔符为逗号时,它会失败。 - Munna Khan
这不是准确的。在 PHP 8.1 中,floatval('125.00') 将返回 125.0,而不是 125。 - benjivm
我在 PHP 7.4 中得到了 3000.24 的 3000。 - MichaelTheDev
已被弃用。 - Steve Moretz

31

这是我使用的:

function TrimTrailingZeroes($nbr) {
    return strpos($nbr,'.')!==false ? rtrim(rtrim($nbr,'0'),'.') : $nbr;
}

注意:这假定 . 是小数分隔符。它的优点是它适用于任意大(或小)的数字,因为没有浮点转换。它也不会将数字转换为科学计数法(例如1.0E-17)。


这不是一个安全的解决方案,如果价格不是十进制数怎么办?例如,如果开发人员将价格乘以整数,则得到的结果也是整数。 - alex
1
@alex 这个函数适用于整数、浮点数和字符串。 - mpen
1
完美的解决方案,作为bcmath的辅助工具。 - Kart Av1k
这是唯一适用的答案,如果输入可能包含逗号千分隔符(无法转换为浮点数)。如果输入来自 number_format(),它始终包含十进制分隔符(如果提供了十进制值),则代码可以简化为:例如:$output = rtrim(rtrim(number_format($input, 10), '0'), '.') - Quinn Comendant
在使用 number_format() 后解析结果非常好。谢谢! - Jeaf Gilbert

23

如果您想在页面或模板上显示数字前删除末尾的零。

您可以使用sprintf()函数。

sprintf('%g','125.00');
// 125

‌‌sprintf('%g','966.70');
// 966.7

‌‌‌‌sprintf('%g',844.011);
// 844.011

谢谢,我喜欢这个答案。对我来说非常有帮助。 - Sumit Kumar Gupta
如何更改小数点和千位分隔符? - Ray Coder
@RayCoder sprintf 没有添加千位分隔符的选项,你可以尝试使用: sprintf('%s', number_format(2699, 0, '.', ',')) - Hemerson Varela

20

只需将+添加到您的字符串变量中,就会将类型转换为(float)并删除零:

var_dump(+'125.00');     // double(125)
var_dump(+'966.70');     // double(966.7)
var_dump(+'844.011');    // double(844.011)
var_dump(+'844.011asdf');// double(844.011)

19

对于所有遇到使用逗号出现问题的访问本网站的人,更改:

$num = number_format($value, 1, ',', '');
至:
$num = str_replace(',0', '', number_format($value, 1, ',', '')); // e.g. 100,0 becomes 100

如果需要去掉两个零,则改为:

$num = str_replace(',00', '', number_format($value, 2, ',', '')); // e.g. 100,00 becomes 100

更多内容请见:PHP数值:小数点只在必要时才显示


9
你应该将你的数字转换为浮点数,这样会自动完成这个过程。
$string = "42.422005000000000000000000000000";
echo (float)$string;

这个输出结果就是你所需要的。

42.422005


2
浮点数转换也可能会破坏您的数字。例如,(float)'0.1234567890124567890123456789'变成了0.12345678901246 - mpen

7

将类型转换为 float

$int = 4.324000;
$int = (float) $int;

7
$x = '100.10'; 
$x = preg_replace("/\.?0*$/",'',$x); 
echo $x;

没有什么比一个简单的正则表达式更不能解决的问题了 ;)

http://xkcd.com/208/


3
去掉数字中无意义的“0”,例如在“100”中。但是无法去掉“100.010”中的“0”。 - mpen
2
大家退后点! $x = preg_replace("/(\.0*$)|((?<=\.\d*)0+$)/",'',$x); - Emanuel S.

4

在添加 +0 时要小心。

echo number_format(1500.00, 2,".",",")+0;
//1

结果为1。

echo floatval('1,000.00');
// 1

echo floatval('1000.00');
//1000

你正在回答一个来自2013年的问题。 - VTodorov
10
如果回答一个旧问题可以帮助现实读者,那么这并不是一个问题。 - Reign.85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接