PHP字符串浮动

新手上路,请多包涵

我根本不熟悉 PHP,并且有一个快速的问题。

我有 2 个变量 pricePerUnitInvoicedUnits 。这是将这些设置为值的代码:

 $InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

如果我输出这个,我会得到正确的值。假设 5000 发票单位和 1.00 价格。

现在,我需要显示花费的总金额。当我将这两个相乘时它不起作用(正如预期的那样,这些是字符串)。

但我不知道如何在 PHP 中解析/转换/转换变量。

我应该怎么办?

原文由 John 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 410
2 个回答

为了完整起见,虽然这个问题很古老,但值得一提的是 filter_var() 函数集,它不仅应该处理格式化位本身,还应该验证或清理输出,因此使用起来更安全在用户填写的表单的上下文中(或者,最终, 可能 有一些损坏/不一致的字段的数据库):

 $InvoicedUnits = (float) filter_var($InvoiceLineItem->InvoicedUnits,
  FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$pricePerUnit  = (float) filter_var($InvoiceLineItem->PricePerUnit,
  FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));

printf("The total is: %.2f\n", $InvoicedUnits * $pricePerUnit); // both are now floats and the result is a float, formatted to two digits after the decimal sign.

这会 清理 输出(仍将是一个字符串) 接受当前区域设置的小数分隔符(例如点与逗号);此外,PHP 手册中还有更多用于 验证 的选项(如果有效,它将自动将结果转换为 float )。对于不同的场景,结果会略有不同——例如,如果您事先知道 $InvoiceLineItem 将只有浮点数的有效数字和符号,或者如果您需要先“清理”该字段,去掉空格、杂散字符(例如货币符号!)等等。

最后,如果您希望获得格式良好的输出——因为总数以 货币 表示——您还应该查看内置的 NumberFormatter,并执行以下操作:

 $InvoicedUnits = (float) filter_var($InvoiceLineItem->InvoicedUnits,
  FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$pricePerUnit  = (float) filter_var($InvoiceLineItem->PricePerUnit,
  FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));

$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo 'Total is: ' . $fmt->formatCurrency($InvoicedUnits * $pricePerUnit, 'EUR') . PHP_EOL;

这还将根据配置的语言环境和其他类似的奇特事物处理千位分隔符(空格、点、逗号…)。

此外,如果您愿意,您可以使用 '' (空字符串)作为默认语言环境字符串(由服务器或可选的浏览器设置)和 $fmt->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL) 获得默认值3 个字母的货币代码(这可能不是您想要的,因为 通常 价格以 特定 货币给出——这些函数 考虑货币汇率!)。

原文由 Gwyneth Llewelyn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题