2
$sum = 000000000117800;

$sum = number_format($sum, 2, ".", ".");

我正在寻找输出 1 178。

总和的长度始终为 15。就像上面分配的一样。总和也可以是:

000000001117800;

那么它将是

11 178

等等。

最后两个定义小数:例如

000000000117805;

将会

1 178,05

我上面的代码给了我:79.00 虽然......

我想知道我是否可以用 ltrim 解决这个问题,但也许还有另一种更好的方法?

4

4 回答 4

3

你的代码是正确的,你只需要使用一个字符串

$sum = "000000000117800";
echo number_format($sum, 2, ".", ".");

打印(http://ideone.com/534ATu

117.800.00

虽然,你必须除以100得到正确的小数部分

$sum = "000000000117800";
echo number_format($sum / 100, 2, ".", ".");

打印(http://ideone.com/A5LFpS

1.178.00

问题是当你分配

$sum = 000000000117800;

它已经被转换为79(作为 的八进制值$sum),您对此无能为力。

那么为什么字符串会起作用呢?因为number_formatexpetcsfloat作为第一个参数,所以 PHP 执行从stringto的转换float,忽略前导0的。结果117800,我们必须进一步除以100得到小数点,然后我们可以number_format用于漂亮的显示,或者干脆做(http://ideone.com/IeBCmF

$sum = "000000000117800";
echo $sum / 100;

并得到

1178

并且对于

$sum = "000000000117805";
echo $sum / 100;

我们得到

1178.05

按照要求

最后一点关于number_format- 要获得您应该使用的所需格式

number_format( $value, 2, ',', ' ')

所以(http://ideone.com/yDQXde

$sum = "000000000117805";
echo number_format( $sum / 100, 2, ',', ' ');

印刷

1 178,05
于 2013-08-15T13:44:51.113 回答
0

看起来您需要事先删除前导 0。我去了
http://writecodeonline.com/php/
并运行了代码

$sum = 000000000117800;
$sum = number_format($sum, 2, ",", ".");<br>
echo $sum;

然后运行代码

$sum = 117800;
$sum = number_format($sum, 2, ",", ".");
echo $sum;

它起作用了,就像前导0导致数字被解释为另一种格式(评论者说的八进制)而不是十进制。编辑:

作为一种解决方案,在运行 number_format 之前尝试 ltrim 以删除leading0 的
http://php.net/manual/en/function.ltrim.php
字符串 ltrim ( string $str [, string $charlist ]
) 从字符串的开头。

于 2013-08-15T13:45:40.443 回答
0

那是因为您的数字由于前导零而被视为八进制。

0117八进制系统正好79是十进制系统。

你的初始值000000000117800被减少到0117因为8不是八进制数字,所以 PHP 削减了你的数字的最后一位。

于 2013-08-15T13:49:05.350 回答
0

您的输出有79两个原因:

  1. 以零开头的数字是八进制,八进制01177*1 + 1*8 + 1*64 == 79
  2. PHP坏了,最后会盲目忽略无效字符

为什么你的号码包含那些前导零?一个数字没有“长度”的概念——这是它的字符串表示的一个属性。

于 2013-08-15T13:49:56.250 回答