PHP number_format():对数字进行四舍五入,然后格式化为货币

问题描述 投票:0回答:6

我正在尝试创建一家电子商务商店,我们的价格需要随着不同国家/地区的汇率而波动,因此我要处理很多小数位。

我想要做的是将原始价格四舍五入到最接近的整数(因为他们可以保留零钱)。但后来我想将其格式化为具有两位小数的货币。

<?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

我怎样才能实现我想要的目标?

php number-formatting
6个回答
0
投票

正如文档中所指定的,number_format 返回一个字符串值,您不能将其重新用作数字。 使用函数 round() 对数字进行四舍五入,如果您想将其四舍五入到直接上位整数,请改用 ceil()

number_format(round(12345.6789), 2);

0
投票

// 应用 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'

0
投票

使用

round
功能,然后使用
number_format

// returns 12,346.00
number_format(round(12345.6789), 2);

0
投票

函数

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);

0
投票

您正在寻找的 PHP 函数是 Money_format() http://php.net/manual/en/function.money-format.php 仔细阅读手册页(包括注释)


0
投票

除了之前仅在计算和舍入后使用

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
,其区域的语言环境决定格式,而其国家/地区的语言环境决定货币。

总之,它允许创建基于区域设置的价格字符串,而无需考虑国家/地区的货币或其格式。

© www.soinside.com 2019 - 2024. All rights reserved.