PHP Conference Nagoya 2025

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::__constructCria um formatador de número

Descrição

Estilo orientado a objetos (método)

public static NumberFormatter::create(string $locale, int $style, ?string $pattern = null): ?NumberFormatter

Estilo procedural

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

Estilo orientado a objetos (construtor):

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

Cria um formatador de número.

Parâmetros

locale

Localidade na qual o número deve ser formatado (nome da localidade, ex.: pt_BR).

style

Estilo da formatação, uma das contantes de estilo de formatação. Se NumberFormatter::PATTERN_DECIMAL ou NumberFormatter::PATTERN_RULEBASED forem passadas, o formato do número será aberto usando o modelo fornecido, que deve estar conforme a sintaxe descrita na » documentação de formato decimal da ICU ou na » documentação de formato de número com base em regras da ICU, respectively.

pattern

String de modelo se o estilo escolhido requerer um modelo.

Valor Retornado

Retorna um objeto NumberFormatter ou null em caso de erro.

Erros/Exceções

Uma exceção ValueError é lançada se locale for inválido.

Registro de Alterações

Versão Descrição
8.4.0 Uma exceção ValueError agora é lançada se locale for inválido.
8.0.0 pattern agora pode ser nulo.

Exemplos

Exemplo #1 Exemplo de 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";
?>

Exemplo #2 Exemplo de 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";
?>

O exemplo acima produzirá:

1.234.567,891
millicentoquarantadue

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 3 notes

up
4
F. Poirotte
15 years ago
When formatting durations using the NumberFormatter::DURATION type, you may also need to use NumberFormatter::setTextAttribute to get the desired output.

<?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));

?>

This is a little counter-intuitive because there is not much doc available about the DURATION type.

Also, as far as I can tell, only the English (en) locale has support for the "%in-numerals" & "%with-words" rulesets. Other locales seem to simply format the input as if the DECIMAL type had been used (at least using "fr" or "de" as the target locale).

One way to provide that feature across different locales is to extract the ruleset implicitely used by NumberFormatter::DURATION and adapt it for the locales you're targetting. Use NumberFormatter::getPattern to extract the ruleset.
up
0
igorsantos07
6 years ago
Although there are ORDINAL and SPELLOUT formatters, it's not possible to join these together to turn "2" into "second". You'll either get "2nd", or "two", or something unexpected if you try to use bitwise operators.
up
0
daniel dot rhodes at warpasylum dot co dot uk
13 years ago
It should be noted that the locale string passed into NumberFormatter's constructor doesn't play with UCA keywords quite as readily as, say, the Collator and IntlDateFormatter classes' constructors.

According to the Unicode spec (http://www.unicode.org/reports/tr35), I should be able to specify a locale of "ja_JP@numbers=jpanfin" which, for spellout mode, should give me Japanese financial (ie. anti-forgery) numerals. When passed into NumberFormatter's constructor, "ja_JP@numbers=jpanfin" doesn't work.

However, when I look at a dump of NumberFormatter::getPattern() for the ja_JP locale, I see that the financial numerals *are* in there (as %financial). Here's how we wrangle them out of the NumberFormatter:

<?php
$number
= 1234567890;

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

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

echo
$formatter->format($number);
//above gives [拾弐億参千四百伍拾六萬七千八百九拾] (as opposed to [十二億三千四百五十六万七千八百九十]) - bingo!
?>
To Top