The NumberFormatter class

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

Введение

Программы хранят и оперируют числами используя, не зависящее от локали, бинарное представление. Когда же они выводятся на экран или печатаются, они конвертируются в строки в соответствии с требованиями локали. К примеру, число 12345.67 выведется как "12,345.67" в локали US, как "12 345,67" во французской локали и как "12.345,67" в немецкой.

Вызывая методы этого класса, вы можете форматировать числа, денежные единицы и процентнын величины в представлении нужной локали. Класс NumberFormatter чуствителен к локали, следовательно вам необходимо будет создавать новый экземпляр класса для каждой локали. Методы NumberFormatter форматируют примитивные типы чисел, такие как "double", и выводят их в специфичном для локали представлении.

Для денежных единиц вы можете использовать тип форматирования денежных единиц, который возвращает строку с отформатированным числом и символом денежной единицы. Естественно NumberFormatter не знает о курсах обмена, так что для всех денежных единиц будет возвращено одно и то же число. К примеру, для числа 9988776.65 результат будет такой:

  • 9 988 776,65 € для Франции
  • 9.988.776,65 € для Германии
  • $9,988,776.65 для США

Для форматирования процентных величин используется свой тип форматирования. При таком форматировании число 0.75 будет выведено как 75%.

Для более сложного форматирования, например для разбора числа, используется форматирование основанное на наборе правил.

Обзор классов

NumberFormatter {
/* Методы */
public __construct ( string $locale , int $style [, string $pattern ] )
public static NumberFormatter create ( string $locale , int $style [, string $pattern ] )
public string formatCurrency ( float $value , string $currency )
public string format ( number $value [, int $type ] )
public int getAttribute ( int $attr )
public int getErrorCode ( void )
public string getErrorMessage ( void )
public string getLocale ([ int $type ] )
public string getPattern ( void )
public string getSymbol ( int $attr )
public string getTextAttribute ( int $attr )
public float parseCurrency ( string $value , string &$currency [, int &$position ] )
public mixed parse ( string $value [, int $type [, int &$position ]] )
public bool setAttribute ( int $attr , int $value )
public bool setPattern ( string $pattern )
public bool setSymbol ( int $attr , string $value )
public bool setTextAttribute ( int $attr , string $value )
}

Предопределенные константы

Данные стили используются функцией numfmt_create() для определения типа форматирования.

NumberFormatter::PATTERN_DECIMAL (integer)
Формат с десятичной точкой заданный шаблоном
NumberFormatter::DECIMAL (integer)
Формат с десятичной точкой
NumberFormatter::CURRENCY (integer)
денежный формат
NumberFormatter::PERCENT (integer)
Процентный формат
NumberFormatter::SCIENTIFIC (integer)
Научный формат
NumberFormatter::SPELLOUT (integer)
Разобранный формат на основе правил
NumberFormatter::ORDINAL (integer)
Числительный формат на основе правил
NumberFormatter::DURATION (integer)
Формат длительности на основе правил
NumberFormatter::PATTERN_RULEBASED (integer)
Формат на основе правил по шаблону
NumberFormatter::DEFAULT_STYLE (integer)
Формат по умолчанию для локали
NumberFormatter::IGNORE (integer)
Псевдоним для PATTERN_DECIMAL

Данные константы определяют как будут разобраны или отформатированы числа. Их необходимо передавать функциям numfmt_format() и numfmt_parse().

NumberFormatter::TYPE_DEFAULT (integer)
Тип определяется типом переменной
NumberFormatter::TYPE_INT32 (integer)
Форматирование/разбор как 32-битного целого
NumberFormatter::TYPE_INT64 (integer)
Форматирование/разбор как 64-битного целого
NumberFormatter::TYPE_DOUBLE (integer)
Форматирование/разбор как рационального (float)
NumberFormatter::TYPE_CURRENCY (integer)
Форматирование/разбор как денежной единицы

Аттрибут формата чисел для numfmt_get_attribute() и numfmt_set_attribute().

NumberFormatter::PARSE_INT_ONLY (integer)
Разбирать только целые.
NumberFormatter::GROUPING_USED (integer)
Использовать группирующий разделитель.
NumberFormatter::DECIMAL_ALWAYS_SHOWN (integer)
Всегда показывать десятичную точку.
NumberFormatter::MAX_INTEGER_DIGITS (integer)
Максимальное число целых цифр.
NumberFormatter::MIN_INTEGER_DIGITS (integer)
Минимальное число целых цифр.
NumberFormatter::INTEGER_DIGITS (integer)
Целых цифр.
NumberFormatter::MAX_FRACTION_DIGITS (integer)
Максимальное число цифр после запятой.
NumberFormatter::MIN_FRACTION_DIGITS (integer)
Минимальное число цифр после запятой.
NumberFormatter::FRACTION_DIGITS (integer)
Число цифр после запятой.
NumberFormatter::MULTIPLIER (integer)
Множитель.
NumberFormatter::GROUPING_SIZE (integer)
Размер группировки.
NumberFormatter::ROUNDING_MODE (integer)
Режим округления.
NumberFormatter::ROUNDING_INCREMENT (integer)
Приращение округления.
NumberFormatter::FORMAT_WIDTH (integer)
Ширина на которую будет дополнен вывод format().
NumberFormatter::PADDING_POSITION (integer)
Позиция с которой дополнение будет иметь место. Смотрите описание констант дополнения.
NumberFormatter::SECONDARY_GROUPING_SIZE (integer)
Вторичный размер группировки.
NumberFormatter::SIGNIFICANT_DIGITS_USED (integer)
Использовать значащие цифры.
NumberFormatter::MIN_SIGNIFICANT_DIGITS (integer)
Минимальное количество значащих цифр.
NumberFormatter::MAX_SIGNIFICANT_DIGITS (integer)
Максимальное количество значащих цифр.
NumberFormatter::LENIENT_PARSE (integer)
Режим снисходительны синтаксического анализа для основанных на правилах форматов.

Аттрибуты текста форматирования чисел, используются в numfmt_get_text_attribute() и numfmt_set_text_attribute().

NumberFormatter::POSITIVE_PREFIX (integer)
Положительный префикс.
NumberFormatter::POSITIVE_SUFFIX (integer)
Положительный суффикс.
NumberFormatter::NEGATIVE_PREFIX (integer)
Отрицательный префикс.
NumberFormatter::NEGATIVE_SUFFIX (integer)
Отрицательный суффикс.
NumberFormatter::PADDING_CHARACTER (integer)
Символ для дополнения строки.
NumberFormatter::CURRENCY_CODE (integer)
Код денежной единицы ISO.
NumberFormatter::DEFAULT_RULESET (integer)
Набор правил по умолчанию. Доступно только для форматирования на основе правил.
NumberFormatter::PUBLIC_RULESETS (integer)
Публичный набор правил. Доступно только для форматирования на основе правил. Этот аттрибут доступен только на чтение. Публичный набор правил возвращается в виде строки, в которой каждый набор правил отделен точкой с запятой (;).

Символы форматирования чисел для numfmt_get_symbol() и numfmt_set_symbol().

NumberFormatter::DECIMAL_SEPARATOR_SYMBOL (integer)
Десятичный разделитель.
NumberFormatter::GROUPING_SEPARATOR_SYMBOL (integer)
Разделитель групп.
NumberFormatter::PATTERN_SEPARATOR_SYMBOL (integer)
Символ разделителя в шаблона.
NumberFormatter::PERCENT_SYMBOL (integer)
Символ процента.
NumberFormatter::ZERO_DIGIT_SYMBOL (integer)
Ноль.
NumberFormatter::DIGIT_SYMBOL (integer)
Символ представляющий цифру в шаблоне.
NumberFormatter::MINUS_SIGN_SYMBOL (integer)
Знак минус.
NumberFormatter::PLUS_SIGN_SYMBOL (integer)
Знак плюс.
NumberFormatter::CURRENCY_SYMBOL (integer)
Символ обозначения денежной единицы.
NumberFormatter::INTL_CURRENCY_SYMBOL (integer)
The international currency symbol.
NumberFormatter::MONETARY_SEPARATOR_SYMBOL (integer)
Денежный разделитель.
NumberFormatter::EXPONENTIAL_SYMBOL (integer)
Символ степени десяти.
NumberFormatter::PERMILL_SYMBOL (integer)
Символ промиле.
NumberFormatter::PAD_ESCAPE_SYMBOL (integer)
Экранирование символа заполнителя.
NumberFormatter::INFINITY_SYMBOL (integer)
Символ бесконечности.
NumberFormatter::NAN_SYMBOL (integer)
Символ NAN (Not-a-number, не-число).
NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL (integer)
Символ значащей цифры.
NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL (integer)
Разделитель групп для денежного формата.

Режимы округления для numfmt_get_attribute() и numfmt_set_attribute() с аттрибутом NumberFormatter::ROUNDING_MODE.

NumberFormatter::ROUND_CEILING (integer)
Округление в сторону положительной бесконечности.
NumberFormatter::ROUND_DOWN (integer)
Округление вниз.
NumberFormatter::ROUND_FLOOR (integer)
Округление в сторону отрицательной бесконечности.
NumberFormatter::ROUND_HALFDOWN (integer)
Округление в сторону "ближайшего соседа" кроме случаев, когда они на одинаковом расстоянии. В этом случае округление вниз.
NumberFormatter::ROUND_HALFEVEN (integer)
Округление в сторону "ближайшего соседа" кроме случаев, когда они на одинаковом расстоянии. В этом случае округление к четному значению.
NumberFormatter::ROUND_HALFUP (integer)
Округление в сторону "ближайшего соседа" кроме случаев, когда они на одинаковом расстоянии. В этом случае округление вверх.
NumberFormatter::ROUND_UP (integer)
Округление вверх.

Значения позиции дополнения для numfmt_get_attribute() и numfmt_set_attribute() с аттрибутом NumberFormatter::PADDING_POSITION.

NumberFormatter::PAD_AFTER_PREFIX (integer)
Символы дополнения вставляются после префикса.
NumberFormatter::PAD_AFTER_SUFFIX (integer)
Символы дополнения вставляются после суффикса.
NumberFormatter::PAD_BEFORE_PREFIX (integer)
Символы дополнения вставляются до префикса.
NumberFormatter::PAD_BEFORE_SUFFIX (integer)
Символы дополнения вставляются до суффикса.

Содержание

add a note add a note

User Contributed Notes 4 notes

up
21
giorgio dot liscio at email dot it
6 years ago
this class seems to be painful: it is not, formatting and parsing are highly customizable, but what you probably need is really simple:

if you want to localize a number use:

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::DECIMAL);
echo
$a->format(12345.12345) . "<br>"; // outputs 12.345,12
$a->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0);
$a->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 100); // by default some locales got max 2 fraction digits, that is probably not what you want
echo $a->format(12345.12345) . "<br>"; // outputs 12.345,12345
?>

if you want to print money use:

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo
$a->format(12345.12345) . "<br>"; // outputs €12.345,12
?>

if you have money data stored as (for example) US dollars and you want to print them using the it-IT notation, you need to use

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo
$a->formatCurrency(12345, "USD") . "<br>"; // outputs $ 12.345,00 and it is formatted using the italian notation (comma as decimal separator)
?>

another useful example about currency (how to obtain the currency name by a locale string):

<?php
$frontEndFormatter
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
$adminFormatter = new \NumberFormatter("en-US", \NumberFormatter::CURRENCY);
$symbol = $adminFormatter->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL); // got USD
echo $frontEndFormatter->formatCurrency(12345.12345$symbol) . "<br>";
?>
up
6
sudheer at binaryvibes dot co dot in
6 years ago
Sample script to print number in English.

<?php
$f
= new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo
$f->format(123456);

?>

Produces the result:
one hundred twenty-three thousand four hundred fifty-six
up
1
Adam
9 months ago
Good to know Numberformatter::SPELLOUT using soft hypens.

So, if you want to avoid it use preg_replace:

<?php
$azaz
= new NumberFormatter("hu-HU", NumberFormatter::SPELLOUT);
$text = preg_replace('~\x{00AD}~u', '', $azaz->format(123456));
print
$text;
?>
Output without preg_replace:
egy-­száz-­huszon-­három-­ezer négy-­száz-­ötven-­hat

Output with preg_replace:
egyszázhuszonháromezer négyszázötvenhat
up
0
Joey
8 months ago
Be warned that this class sometimes lacks sufficient error output. I recently instantiated it while invalid pattern to the constructor.

    php -r '$nf = new \NumberFormatter("tlh-KX.UTF8", \NumberFormatter::IGNORE, "{,,#;#}");var_dump($nf->format(5));'

    Fatal error: Call to a member function format() on null in Command line code on line 1

Rather than emitting an error message or throwing an exception null is returned after calling new.

I'm not sure if it's fixed in PHP 7 but it's something to watch out for. Make sure you check your parameters very closely.
To Top