我正在尝试创建一家电子商务商店,我们的价格需要随着不同国家/地区的汇率而波动,因此我要处理很多小数位。
我想要做的是将原始价格四舍五入到最接近的整数(因为他们可以保留零钱)。但后来我想将其格式化为具有两位小数的货币。
<?php
$number = 12345.6789;
echo $number; // outputs '12345.6789'
$number = number_format($number,0);
echo $number; // outputs '12,346'
$number = number_format($number,2);
echo $number; // outputs '12.00'
?>
格式化为无小数位后,它开始读取“,”作为小数分隔符而不是千位分隔符,并将其格式化为两位小数。
它还给出以下错误:
A non well formed numeric value encountered in C:\wamp64\www\Lifting365\test.php on line 6
我怎样才能实现我想要的目标?
// 应用 intval 来获取低整数值(用于更改目的)
$number = 12345.6789;
echo $number; // outputs '12345.6789'
echo intval($number)."<br/>"; // outputs '12345'
echo number_format(intval($number),0,'.','.'); // outputs '12.345'
echo number_format(intval($number),0,'.',','); // outputs '12,345'
函数
number_format
接受 4 个参数。默认情况下,点将用作小数分隔符,逗号将用作千位分隔符(第一次调用后 12345.6789 变为 12,346;例外)。它没有明确记录,但 number_format 也会四舍五入。
http://php.net/manual/de/function.number-format.php
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
您收到错误是因为您重复使用了相同的变量
$number
。第一次调用 number_format
后,您不再有浮点值。
<?php
$number = 12345.6789;
echo $number."<br>"; // outputs 12345.6789
echo number_format($number,0)."<br>"; // outputs 12,346
echo number_format($number,2)."<br>"; // outputs 12,345.68
?>
如果您不确定变量中的内容,您可以对其应用
floatval
。
echo number_format(floatval($number),2);
您正在寻找的 PHP 函数是 Money_format() http://php.net/manual/en/function.money-format.php 仔细阅读手册页(包括注释)
除了之前仅在计算和舍入后使用
number_format()
的答案之外 - 如果您想要动态的与区域设置相关的价格和货币格式并且启用了 intl 扩展,那么您可以使用 PHP 的数字格式来实现正确的格式区域设置(https://www.php.net/manual/en/class.numberformatter.php)。此实现支持过程 (numfmt_*
) 和面向对象 (NumberFormatter
) 方法。
对于这个例子,我使用面向对象的方法来演示您想要实现的目标(在计算、舍入等之后)。
$price = 75.33;
$locale = 'en_GB';
$fmt = new NumberFormatter($locale, NumberFormatter::CURRENCY);
echo $fmt->formatCurrency($price, $fmt->getSymbol($fmt::INTL_CURRENCY_SYMBOL)); // £75.33
可以实现更多有趣的东西,例如在计算汇率乘法后对小数点进行四舍五入:
$price = 75.50; // Note the change in price
$locale = 'en_US'; // Note the change in locale
$fmt = new NumberFormatter($locale, NumberFormatter::CURRENCY);
$fmt->setAttribute($fmt::FRACTION_DIGITS, 0);
echo $fmt->formatCurrency($price, $fmt->getSymbol($fmt::INTL_CURRENCY_SYMBOL)); // $76
或更改其舍入模式:
$fmt->setAttribute($fmt::ROUNDING_MODE, $fmt::ROUND_DOWN);
echo $fmt->formatCurrency($price, $fmt->getSymbol($fmt::INTL_CURRENCY_SYMBOL)); // $75
对于使用不同货币符号位置或具有不同数字格式的国家/地区(例如荷兰、法国或德国)来说特别方便。使用
NumberFormatter
,其区域的语言环境决定格式,而其国家/地区的语言环境决定货币。
总之,它允许创建基于区域设置的价格字符串,而无需考虑国家/地区的货币或其格式。