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

变更日志

版本 描述
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
14 年前
当使用 NumberFormatter::DURATION 类型格式化持续时间时,您可能还需要使用 NumberFormatter::setTextAttribute 来获得所需的输出。

<?php

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

// "%in-numerals" is the default ruleset, so this results in the same as above.
$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%in-numerals");
// Outputs: string(7) "3:25:45"
var_dump($fmt->format(12345));

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

$fmt2 = new NumberFormatter('fr', NumberFormatter::DURATION);
// Outputs: string(7) "12 345"
// See notes below.
var_dump($fmt2->format(12345));

?>

这有点违反直觉,因为关于 DURATION 类型没有太多文档。

此外,据我所知,只有英语(en)区域设置支持 "%in-numerals" 和 "%with-words" 规则集。其他区域设置似乎只是将输入格式化为使用 DECIMAL 类型(至少使用 "fr" 或 "de" 作为目标区域设置)。

跨不同区域设置提供该功能的一种方法是提取 NumberFormatter::DURATION 隐式使用的规则集,并将其适应您要定位的区域设置。使用 NumberFormatter::getPattern 提取规则集。
igorsantos07
5 年前
尽管存在 ORDINAL 和 SPELLOUT 格式化程序,但无法将它们组合在一起将“2”转换为“second”。尝试使用按位运算符时,您将得到“2nd”或“two”,或者出现意外结果。
daniel dot rhodes at warpasylum dot co dot uk
12 年前
需要注意的是,传递给 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