2013-10-10 6 views
7

У меня возникли проблемы с использованием класса php NumberFormatter. Я хочу, чтобы округленные цифры отображались без каких-либо десятичных знаков, а цифры с десятичными знаками округлялись с двумя десятичными знаками. т.е.Форматирование валюты с использованием numberFormatter

$fmt = new NumberFormatter('nl', NumberFormatter::CURRENCY); 
$fmt->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0); 
$fmt->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2); 

var_dump($fmt->formatCurrency(15.15, 'EUR')); //Outputs € 15,15 
var_dump($fmt->formatCurrency(15, 'EUR')); //Outputs € 15,00 

Как вы можете видеть последний дамп вывода 15,00, но я ожидал 15 здесь. Всякий раз, когда я использую «полный» язык nl_NL вместо nl, форматтер ведет себя так, как ожидалось, но я не могу использовать это, потому что у меня есть только язык, доступный в моей локали.

$fmt = new NumberFormatter('nl_NL', NumberFormatter::CURRENCY); 
$fmt->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0); 
$fmt->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2); 

var_dump($fmt->formatCurrency(15.15, 'EUR')); //Outputs € 15,15 
var_dump($fmt->formatCurrency(15, 'EUR')); //Output € 15 

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

+0

Определенно выглядит как ошибка. Если это действительно так, исправление заключается не в использовании NumberFormatter, а в создании собственного. Для быстрого исправления вы можете запросить форматированную валюту для 00 в конце строки и просто отключить ее, если она истинна. –

+0

Спасибо за ваш комментарий. Написание собственного кода на самом деле не является вариантом, так как у нас есть сайт со многими языками. Я мог бы реализовать такое грязное исправление, если у кого-то еще нет лучшего решения. –

ответ

0

Грязные фикс:

$formattedCurrency = preg_replace('/,00$/', '', $fmt->formatCurrency(15, 'EUR')); 
+1

Спасибо. Это должно быть '/ [, \.] 00 $ /' btw, потому что на английском они используют точки. 15.00 –

+0

Правильно, если ошибка также появляется в этих форматах. –

0

вы можете использовать MAX_SIGNIFICANT_DIGITS атрибут:

$fmt = new NumberFormatter('nl', NumberFormatter::CURRENCY); 
$fmt->setAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS, 7); 

var_dump($fmt->formatCurrency(15.15, 'EUR')); // Outputs € 15,15 
var_dump($fmt->formatCurrency(15, 'EUR')); // Outputs € 15 
Смежные вопросы