PHP Conference Japan 2024

NumberFormatter::create

numfmt_create

NumberFormatter::__construct

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

NumberFormatter::create -- numfmt_create -- NumberFormatter::__construct建立數字格式器

說明

物件導向風格 (方法)

public static NumberFormatter::create(字串 $locale, 整數 $style, ?字串 $pattern = null): ?NumberFormatter

程序式風格

numfmt_create(字串 $locale, 整數 $style, ?字串 $pattern = null): ?NumberFormatter

物件導向風格 (建構子)

public NumberFormatter::__construct(字串 $locale, 整數 $style, ?字串 $pattern = null)

建立一個數字格式器。

參數

locale

數字格式化的地區設定 (地區設定名稱,例如 en_CA)。

style

格式化樣式,為 格式樣式 常數之一。如果傳入 NumberFormatter::PATTERN_DECIMALNumberFormatter::PATTERN_RULEBASED,則會使用給定的模式開啟數字格式,該模式必須符合 » ICU DecimalFormat 文件» ICU RuleBasedNumberFormat 文件 中分別描述的語法。

pattern

如果所選樣式需要模式,則為模式字串。

傳回值

傳回 NumberFormatter 物件或錯誤時傳回 null

錯誤/例外

如果 locale 無效,則會擲出 ValueError

更新日誌

版本 說明
8.4.0 如果 locale 無效,則會擲出 ValueError
8.0.0 pattern 現在可以為 null。

範例

範例 #1 numfmt_create() 範例

<?php
$fmt
= numfmt_create( 'de_DE', NumberFormatter::DECIMAL );
echo
numfmt_format($fmt, 1234567.891234567890000)."\n";
$fmt = numfmt_create( 'it', NumberFormatter::SPELLOUT );
echo
numfmt_format($fmt, 1142)."\n";
?>

範例 #2 NumberFormatter::create() 範例

<?php
$fmt
= new NumberFormatter( 'de_DE', NumberFormatter::DECIMAL );
echo
$fmt->format(1234567.891234567890000)."\n";
$fmt = new NumberFormatter( 'it', NumberFormatter::SPELLOUT );
echo
$fmt->format(1142)."\n";
?>

上述範例將輸出:

1.234.567,891
millicentoquarantadue

參見:

新增註解

使用者貢獻的註解 3 則註解

F. Poirotte
15 年前
當使用 NumberFormatter::DURATION 類型格式化持續時間時,您可能還需要使用 NumberFormatter::setTextAttribute 來獲得所需的輸出。

<?php

$fmt
= new NumberFormatter('en', NumberFormatter::DURATION);
// 輸出:string(7) "3:25:45"
var_dump($fmt->format(12345));

// "%in-numerals" 是預設規則集,因此結果與上述相同。
$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%in-numerals");
// 輸出:string(7) "3:25:45"
var_dump($fmt->format(12345));

$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%with-words");
// 輸出:string(31) "3 hours, 25 minutes, 45 seconds"
var_dump($fmt->format(12345));

$fmt2 = new NumberFormatter('fr', NumberFormatter::DURATION);
// 輸出:string(7) "12 345"
// 請參閱以下說明。
var_dump($fmt2->format(12345));

?>

這有點違反直覺,因為關於 DURATION 類型的文件不多。

此外,據我所知,只有英文 (en) 語系支援 "%in-numerals" 和 "%with-words" 規則集。其他語系似乎只是將輸入格式化,就像使用了 DECIMAL 類型一樣(至少使用 "fr" 或 "de" 作為目標語系時是如此)。

要跨不同語系提供該功能的一種方法是提取 NumberFormatter::DURATION 隱式使用的規則集,並針對您的目標語系進行調整。使用 NumberFormatter::getPattern 來提取規則集。
igorsantos07
6 年前
雖然有 ORDINAL 和 SPELLOUT 格式器,但無法將它們結合起來將「2」轉換為「second」。如果您嘗試使用位元運算子,您只會得到「2nd」或「two」,或者一些意想不到的結果。
daniel dot rhodes at warpasylum dot co dot uk
13 年前
需要注意的是,傳遞給 NumberFormatter 建構函式的語系字串與 UCA 關鍵字的搭配不如 Collator 和 IntlDateFormatter 類別的建構函式那麼容易。

根據 Unicode 規範 (http://www.unicode.org/reports/tr35),我應該能夠指定 "ja_JP@numbers=jpanfin" 語系,這在拼寫模式下應該會給我日文財務(例如防偽)數字。當傳遞給 NumberFormatter 的建構函式時,"ja_JP@numbers=jpanfin" 無效。

但是,當我查看 ja_JP 語系的 NumberFormatter::getPattern() 的傾印時,我發現財務數字*在*那裡(作為 %financial)。以下是我們如何從 NumberFormatter 中提取它們

<?php
$number
= 1234567890;

$formatter = new NumberFormatter('ja_JP', NumberFormatter::SPELLOUT);

$formatter->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%financial");

echo
$formatter->format($number);
//以上程式碼會輸出 [拾弐億参千四百伍拾六萬七千八百九拾] (而不是 [十二億三千四百五十六万七千八百九十]) - 搞定!
?>
To Top