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(string $locale, int $style, ?string $pattern = null): ?NumberFormatter

过程式风格

numfmt_create(string $locale, int $style, ?string $pattern = null): ?NumberFormatter

面向对象风格(构造函数)

public NumberFormatter::__construct(string $locale, int $style, ?string $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 现在可以为空。

示例

示例 #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 构造函数的语言环境字符串并不像 Collator 和 IntlDateFormatter 类的构造函数那样容易地与 UCA 关键字配合使用。

根据 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);
// 上述给出了 [拾弐億参千四百伍拾六萬七千八百九拾](而不是 [十二億三千四百五十六万七千八百九十]) - bingo!
?>
To Top