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 |
+-------+--------+----------+-------+