【问题标题】:PHP number_format not working as expectedPHP number_format 未按预期工作
【发布时间】:2021-10-21 20:23:32
【问题描述】:

PHP 7.3.4

当我使用时

$val = '1,234.00';
echo number_format($val, 2, '.', '');

我明白了

1   (desired output is 1234.00)

如果我这样做

$val = '1,234.00';
$val = str_replace([',', '$'], '', $val);
echo number_format($val, 2, '.', '');

我明白了

1234.00

为什么第一个不起作用?我对 number_format 函数缺少什么?

【问题讨论】:

  • number_format() 将浮点数作为第一个参数,你给它一个已经格式化的字符串。
  • number_format(float $num, . . . ) 当该字符串转换为float 时,它是1,因为它会截断无效字符以及之后的所有内容。见echo (float)'1,234.00';
  • 不,不要浮动 $val。在number_format() 之前使用$val = str_replace(',', '', $val);
  • @cottton 我没有对float说它,这只是说明它的作用。
  • 建议开启所有错误报告,php会显示“注意:在...中遇到格式不正确的数值”

标签: php


【解决方案1】:

number_format()有2个重点需要了解

  • number_format() 将浮点数作为第一个参数。如果给出字符串,则将其转换为 Integer/Float。如果在字符串中找到任何字符,则取该字符之前的整数部分。
  • 返回一个数以千计为一组的数字,表示一个字符串。

首先检查数据类型

$a = 1234; // integer
$a = 1234.00; // float
$a = "1234.00"; // string and we can use it as int/float
$a = "1,234.00"; // string but we can't use as int/float because of comma

在第一个例子中

$val = '1,234.00';
echo number_format($val, 2, '.', '');

$val 的类型是字符串。所以 number_format() 只接受字符串的 int/float 部分,当找到任何字符时会修剪该数字。所以只取 1,你得到 1.00。 让我们试试

$val = '12,34.00';
echo number_format($val, 2, '.', '');
$val = '12Z34.00'; // also check with this
echo number_format($val, 2, '.', '');

你会得到两者的结果 12.00。你也可以检查

$val = 12,34;
echo number_format($val, 2, '.', '');

你会得到

PHP 解析错误:语法错误,意外 ','

这意味着它不假设 $val 作为字符串。让我们检查一个没有 ',' 的字符串,我们将再次使用 number_format() 和转换后的数字。

$val = "1234.00";
echo $first = number_format($val, 2, '.', ',');
echo $second = number_format($first, 2, '.', ',');

上面例子的输出是:

1,234.00

1.00

所以 $val 像浮点数一样工作,在 $first 中我们得到一个字符串数字,对于 $second 它再次用逗号分隔,输出为1.00。所以如果你有一个带逗号的字符串,首先你需要从那个字符串中删除逗号,然后使用number_format()格式化它

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2013-10-12
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2018-12-22
    相关资源
    最近更新 更多