如何在PHP中根据特定值格式化十进制数

6

我有几个值:

99.00

99.90

99.01

请注意,上述3个值已经通过number_format($value, 2)获得。

但现在我想去除小数点而不四舍五入,例如:

99.00 变成 99

99.90 变成 99.9

99.01 保持不变

怎样才能实现呢? 请大家给我想一个方法。

我只需要一个函数来检查以下内容:

  1. 给定的数字是否是十进制,即是否带有"."和小数点后的数字
  2. 最后一位数字是否为0,如果是,那么将其去掉
  3. 小数点后面的两个数字是否都是0,如果是,则将它们删掉。
  4. 如果它们中的任何一个不是0,则应该保留,例如99.09应该保持不变,在99.90的情况下应该是99.9。

期待你们的想法。提前致谢。


使用 round() 代替 number_format() - Mark Baker
如果我的回答解决了您的问题,请将我的答案标记为已接受 :) - user2342558
难抉择,有三种不错的答案和方法可供选择 ;) - IncredibleHat
我更新了我的。 - user2342558
https://dev59.com/RW855IYBdhLWcg3wMRRV - Pramod Kharade
4个回答

3

将数字添加0,右侧的零将被删除:

$num1 = 99.00;
$num2 = 99.90;
$num3 = 99.01;
$num4 = 99.012;
$num5 = 99.0123;

$num1 = number_format(99.00,   2, '.', '') + 0;
$num2 = number_format(99.90,   2, '.', '') + 0;
$num3 = number_format(99.01,   2, '.', '') + 0;
$num4 = number_format(99.012,  2, '.', '') + 0;
$num5 = number_format(99.0123, 2, '.', '') + 0;

echo "$num1\n";
echo "$num2\n";
echo "$num3\n";
echo "$num4\n";
echo "$num5\n";

输出:

99
99.9
99.01
99.01
99.01

请在这里尝试。

使用一个function

function round2no0(&$num)
{
    $num = number_format($num, 2, '.', '') + 0;
}

使用方法:

$num1 = 99.00;
$num2 = 99.90;
$num3 = 99.01;
$num4 = 99.012;
$num5 = 99.0123;

round2no0($num1);
round2no0($num2);
round2no0($num3);
round2no0($num4);
round2no0($num5);

echo "$num1\n";
echo "$num2\n";
echo "$num3\n";
echo "$num4\n";
echo "$num5\n";

function round2no0(&$num)
{
    $num = number_format($num, 2, '.', '') + 0;
}

输出:

99
99.9
99.01
99.01
99.01

编辑:

为了处理包含千位分隔符的数字并保留机器格式12345.12,在number_format中添加了, '.', ''参数。

可以在这里进行尝试。


你的例子只有在所需结果最多保留2位小数时才是正确的。 - user2342558
@PramodKharade,你在这里评论的目的是什么?!? - user2342558
我尝试了上述代码,但是对于某些值存在问题,例如:<?php $num1 = number_format(floatval("1,200.00"), 2) + 0; $num2 = number_format(1200.00, 2) + 0; $num3 = number_format(99.11, 2) + 0; $num4 = number_format(99.00, 2) + 0; $num5 = number_format(99.000, 2) + 0; echo "$num1\n"; echo "$num2\n"; echo "$num3\n";
echo "$num4\n";
echo "$num5\n";
?> 1 1 99.11 99 99请注意,num1和num2返回的是1,而我需要它们为1,200。
- Asnexplore
@Asnexplore 看看我的编辑:现在它也可以正确处理千位数字了。 - user2342558

2

你应该能够只需将其包装在 floatval()


0

试试这个:

echo round(99.001, 2), PHP_EOL;
echo round(99.901, 2), PHP_EOL;
echo round(99.011, 2), PHP_EOL;

输出:

99
99.9
99.01

1
number_format 也会四舍五入,所以我认为 Asnexplore 对它的四舍五入是可以接受的。你的答案是最简洁的解决方案(他只需要这个,没有更多的要求),不知道为什么会被踩。 - IncredibleHat
1
@IncredibleHat 你说得对,他已经进行了四舍五入,所以我删除了我添加的额外内容。 - dhinchliff
是的,四舍五入等操作都完成了。我需要在此之后将这些结果清理掉末尾的0或0们。 - Asnexplore
尝试使用数字,例如1200.91、1,200.00、1,200.90、1,200。如果没有逗号,它们将显示为1,但如果有逗号,它们会产生错误消息 解析错误:/tmp/execpad-edf220d84a3a/source-edf220d84a3a的第2行出现语法错误,意外的“,”。 - Asnexplore
虽然我很感激你在帮助我方面所付出的努力,但不幸的是,它仍然没有达到我想要的效果。 - Asnexplore
这是因为逗号后面的所有内容都会被忽略。不要使用逗号,数字没有逗号,你正在使用字符串。输入应该是数字 1200.90 而不是字符串 1,200.90 - dhinchliff

0

如果您使用number_format的自定义符号,您可以使用preg_replace来删除小数点分隔符和其后面的尾随零。

// Default notation
echo preg_replace('/\.?0+$/', '', number_format(9990.00, 2)); // "9,990"
echo preg_replace('/\.?0+$/', '', number_format(9990.90, 2)); // "9,990.9"
echo preg_replace('/\.?0+$/', '', number_format(9990.01, 2)); // "9,990.01"

// French notation
echo preg_replace('/,?0+$/', '', number_format(9990.00, 2, ',', ' ')); // "9 990"
echo preg_replace('/,?0+$/', '', number_format(9990.90, 2, ',', ' ')); // "9 990,9"
echo preg_replace('/,?0+$/', '', number_format(9990.01, 2, ',', ' ')); // "9 990,01"

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