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(浮點數 $amount, 字串 $currency): 字串|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.dev.org.tw/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)
匿名
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