PHP Conference Japan 2024

NumberFormatter::formatCurrency

numfmt_format_currency

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

NumberFormatter::formatCurrency -- numfmt_format_currency格式化货币值

描述

面向对象风格

public NumberFormatter::formatCurrency(float $amount, string $currency): string|false

过程化风格

numfmt_format_currency(NumberFormatter $formatter, float $amount, string $currency): string|false

根据格式化程序规则格式化货币值。

参数

formatter

NumberFormatter 对象。

amount

数值货币值。

currency

表示要使用的货币的 3 个字母的 ISO 4217 货币代码。

返回值

表示格式化货币值的字符串,或在失败时返回false

示例

示例 #1 numfmt_format_currency() 示例

<?php
$fmt
= numfmt_create( 'de_DE', NumberFormatter::CURRENCY );
echo
numfmt_format_currency($fmt, 1234567.891234567890000, "EUR")."\n";
echo
numfmt_format_currency($fmt, 1234567.891234567890000, "RUR")."\n";
$fmt = numfmt_create( 'ru_RU', NumberFormatter::CURRENCY );
echo
numfmt_format_currency($fmt, 1234567.891234567890000, "EUR")."\n";
echo
numfmt_format_currency($fmt, 1234567.891234567890000, "RUR")."\n";
?>

示例 #2 面向对象示例

<?php
$fmt
= new NumberFormatter( 'de_DE', NumberFormatter::CURRENCY );
echo
$fmt->formatCurrency(1234567.891234567890000, "EUR")."\n";
echo
$fmt->formatCurrency(1234567.891234567890000, "RUR")."\n";
$fmt = new NumberFormatter( 'ru_RU', NumberFormatter::CURRENCY );
echo
$fmt->formatCurrency(1234567.891234567890000, "EUR")."\n";
echo
$fmt->formatCurrency(1234567.891234567890000, "RUR")."\n";
?>

以上示例将输出

1.234.567,89 €
1.234.567,89 RUR
1 234 567,89€
1 234 567,89р.

注释

注意:

此格式化方法可实现的格式无法完全利用底层 ICU 库的可能性,例如使用窄货币符号格式化货币。

要充分利用它们,请使用 msgfmt_format_message()

参见

添加注释

用户贡献注释 8 条注释

Ruben
12 年前
虽然此函数接受货币的浮点数(为了显示分),但您应该(对于对此至关重要的应用程序)永远不要使用浮点数来存储或处理货币,因为可能会发生舍入错误。相反,在内部使用整数(如果整数不够大,则使用 BigInt 类),其中整数表示总分数值。另一种方法(特别是如果您需要的精度高于分)是使用 BC(二进制计算器)数学模块,该模块以 100% 的精度处理任意精度的数字。
martin t holzhauer dohd eu
10 年前
当您想要格式化没有子单位的货币并且货币不是给定区域设置使用的货币时,您需要_在_设置 NumberFormatter::FRACTION_DIGITS _之前_ 将货币代码设置为 TextAttribute。

<?php
$fmt
= new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$fmt->setTextAttribute(NumberFormatter::CURRENCY_CODE, 'EUR');
$fmt->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$fmt->formatCurrency(100, 'EUR');
?>
mail at cebe dot cc
9年前
关于不同格式的说明[1]实际上并不依赖于PHP版本,而是依赖于PHP编译所用的ICU库[2]的版本,因为这个库拥有一个包含不同语言环境格式规则的数据库。

[1]: https://php.net/manual/en/numberformatter.formatcurrency.php#116610
[2]: http://site.icu-project.org/
Tyler Crompton
9年前
这让我百思不得其解。在处理某些英语语言环境(例如,“en_US”和“en_CA”等,但肯定不是全部)时,需要注意的是,PHP 5.5和PHP 5.6之间负数的格式不同。

代码

<?php

$formatter
= new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo
$formatter->formatCurrency(-0.99, 'USD'), PHP_EOL;

$formatter = new NumberFormatter('en_CA', NumberFormatter::CURRENCY);
echo
$formatter->formatCurrency(-0.99, 'USD'), PHP_EOL;

?>

PHP 5.5 输出

-$0.99
-US$0.99

PHP 5.6 输出

($0.99)
(US$0.99)
Anonymous
7年前
formatCurrency() 不遵循此处发布的货币小数的国际标准:https://www.currency-iso.org/en/home/tables/table-a1.html.

为了定义小数位数,我发现需要在设置一些NumberFormat属性后使用format()函数。

例如,“COP”(哥伦比亚比索)如果定义为使用2位小数,但是NumberFormat::formatCurrency()为此货币使用0位小数(我不知道为什么!)。

这是我使用的代码

$fmt = new \NumberFormatter( 'fr', \NumberFormatter::CURRENCY);
$fmt->setTextAttribute( $fmt::CURRENCY_CODE, 'COP' );
$fmt->setAttribute( $fmt::FRACTION_DIGITS, 2 );
$numberString = $fmt->format( 1234.56 );

输出结果为:1 234,56 $CO

如果语言环境更改为“en”,则输出结果为:COP1,234.56
andrewfenn at gmail dot com
7年前
货币符号似乎存在虚假的支持。

以泰铢符号为例.. ฿,它在泰语语言环境中似乎不受支持,但在其他语言环境(如简体中文)中却受支持。

<?php
$fmt
= new NumberFormatter('th_TH', NumberFormatter::CURRENCY);
echo
$fmt->formatCurrency(100, 'THB');
// 输出:THB 100

$fmt = new NumberFormatter('zh_Hans', NumberFormatter::CURRENCY);
echo
$fmt->formatCurrency(100, 'THB');
// 输出:฿ 100
?>
Benoit Borrel
9年前
设置模式时,不要忘记货币符号和数字之间的空格字符(作为前缀或后缀)不应该可中断(例如 HTML 中的 &nbsp;)。例如,在 UTF-8 中,应使用不间断空格字符("\xC2\xA0")
<?php
$fmt
= new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$fmt->setPattern(str_replace('¤#',"¤\xC2\xA0#", $fmt->getPattern()));
?>
Patanjali
4年前
在PHP会话的第一次运行中,此函数通常比后续运行慢1000多倍,即使每次都使用新创建的格式化程序。

第一次运行的计时结果从60毫秒到195毫秒不等,而后续运行远低于100微秒。

相比之下,创建格式化程序大约需要100微秒。
To Top