NumberFormatter оставить всегда 2 цифры после плавающей запятой

Я закончил с небольшим перегибом здесь, но я просто не могу понять, как это прибить:

$formatter = new NumberFormatter('lv_LV', NumberFormatter::DECIMAL);

$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::DECIMAL_ALWAYS_SHOWN, 2);

То, что я пытаюсь достичь здесь:

+-------+--------+----------+-------+
| INPUT | ACTUAL | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5.77 |     5.77 | YES   |
|  5,20 |    5.2 |     5.20 | NO    |
|  5,00 |      5 |     5.00 | NO    |
|     0 |      0 |     0.00 | NO    |
+-------+--------+----------+-------+

Короче говоря, я всегда хочу 2 цифры за плавающей точкой.

Как мне добиться этого с помощью NumberFormatter в PHP?

2 ответа

Решение

Вы должны использовать http://php.net/manual/en/function.number-format.php

$var = number_format(553,2);
echo $var

Где 553 - это число, а 2 - количество отображаемых десятичных знаков. Это будет выход

553,00

NumberFormatter имеет способ работать с валютами, если вы ищете то, что вам нужно после http://php.net/manual/en/function.money-format.php

Принятый ответ правильный, я хочу дать разъяснение, почему ОП не получил ожидаемых результатов с NumberFormatter,

NumberFormatter::parse будут output float и принимает string аргумент в указанном формате локали. Parse, однако, не форматирует вывод. Это эквивалент выполнения echo (float) '5.20'; //(float) 5.2

NumberFormatter::format будут output string в указанном формате локали и принимает integer или же float аргумент. Это эквивалент выполнения echo number_format(5.20, 2); //(string) "5.20" тем не мение number_format использует значения по умолчанию в качестве разделителей дроби и тысяч, и их необходимо будет изменить в зависимости от желаемых правил отображения.

NumberFormatter требует, чтобы вы позвонили parse метод до вызова format метод для преобразования строкового значения конкретной локали в эквивалент целочисленного значения или значения с плавающей запятой и отдельного NumberFormatter для вашего желаемого выхода.

$input = new \NumberFormatter('lv', \NumberFormatter::DECIMAL);
$input->setAttribute($input::FRACTION_DIGITS, 2); //applies rounding during format

$output = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
$output->setAttribute($output::FRACTION_DIGITS, 2); //applies rounding during format

foreach (['5,77', '5,20', '5,2', '5,00', '5', '0'] as $value) {
   $parsed = $input->parse($value);
   var_dump($parsed); //convert to PHP value float
   var_dump($output->format($parsed)); //convert to locale based display
   var_dump($input->format($parsed)); //convert to locale based display
   echo "<br/>\n";
}

вход:: синтаксический анализ

+-------+--------+----------+-------+
| Value |  Parse | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5.77 |     5.77 | YES   |
|  5,20 |    5.2 |      5.2 | YES   |
|   5,2 |    5.2 |      5.2 | YES   |
|  5,00 |      5 |        5 | YES   |
|     5 |      5 |        5 | YES   |
|     0 |      0 |        0 | YES   |
+-------+--------+----------+-------+

Выходной формат

+-------+--------+----------+-------+
| Value | Format | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5.77 |     5.77 | YES   |
|  5,20 |   5.20 |     5.20 | YES   |
|   5,2 |   5.20 |     5.20 | YES   |
|  5,00 |   5.00 |     5.00 | YES   |
|     5 |   5.00 |     5.00 | YES   |
|     0 |   0.00 |     0.00 | YES   |
+-------+--------+----------+-------+

вход:: формат

+-------+--------+----------+-------+
| Value | Format | EXPECTED | VALID |
+-------+--------+----------+-------+
|  5,77 |   5,77 |     5,77 | YES   |
|  5,20 |   5,20 |     5,20 | YES   |
|   5,2 |   5,20 |     5,20 | YES   |
|  5,00 |   5,00 |     5,00 | YES   |
|     5 |   5,00 |     5,00 | YES   |
|     0 |   0,00 |     0,00 | YES   |
+-------+--------+----------+-------+
Другие вопросы по тегам