2009-07-21 2 views
4

Я использую класс PHP NumberFormatter для печати значений валюты.Как мне заставить NumberFormatter печатать отрицательные значения валюты со знаком минус?

Например:

$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 
    $cFormatter->formatCurrency(123, 'USD'); 
    $cFormatter->formatCurrency(123, 'BRL'); 
    $cFormatter->formatCurrency(123, 'GBP'); 

Это прекрасно работает, и возвращает "$123.00 ""R$123.00", "£123.00 "соответственно, как и ожидалось

Но отрицательные числа печатаются. "Бухгалтерия стиля", окруженные скобками, вместо . ведущего минус "-"

например:

$cFormatter->formatCurrency(-456, 'USD'); 

Возврат "($456.00)", тогда как я хочу "-$456.00". Конечно, есть простой способ сделать это?

можно удалить скобки путем переопределения префикса и суффикса следующим образом:

$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-"); 
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_SUFFIX, ""); 

Но тогда я не получаю символ валюты, например "-456.00".

Есть ли код выхода для символа валюты, который мне нужно использовать при настройке атрибута NEGATIVE_PREFIX?

Редактировать: Я рад установить другой язык, если это дает мне результат, который я ищу.

Edit 2: Глядя на Intl library docs (что библиотека используется для реализации NumberFormatter), следующие выглядели многообещающими:

¤ (\ u00A4): Префикс или суффикс: Нет Знак валюты, замененный по символу валюты. Если в два раза заменить символ международной валюты. Если втрое, заменить на двоичные имена в валюте, например, «доллар США» или «доллары США» для Америки. Если он присутствует в шаблоне, вместо десятичного разделителя используется денежный десятичный разделитель.

Но это:

$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤"); 

просто печатает "-¤123", так что никакой радости.

Редактировать 3: Я думаю, что нашел ответ, см. Ниже.

+0

therefromhere: В свете «Я счастлив, чтобы установить другую локаль, если это дает мой результат, который я ищу ». См. Мой обновленный ответ: используйте en_AU. – hobodave

ответ

10

Я нашел немного менее хакерский способ свести поведение локального пользователя en_US к тому, что я ищу - функции getPattern()/setPattern().

$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY); 
$sPattern = $cFormatter->getPattern(); // returns "¤#,##0.00;(¤#,##0.00)"; 

$sMyPattern = "¤#,##0.00;-¤#,##0.00"; 
$cFormatter->setPattern($sMyPattern); 
$cFormatter->formatCurrency(-456, 'USD'); // returns -$456.00 
1

Таким образом, вы являетесь причиной разрушения точки локализации. Поскольку ¤ представляет знак доллара, и вы говорите, что ваш шаблон всегда помещает знак в начало номера, что не относится к каждой валюте.Если вы хотите удалить скобки, я бы что-то больше, как,

$locale = 'en_US';  
$nf = new \NumberFormatter($locale, \NumberFormatter::CURRENCY); 
$nf->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $decimals); 

$pattern = str_replace(array('(',')'),'',$nf->getPattern()); 
$nf->setPattern($pattern); 

echo $nf->format($number); 
0

Просто вы можете сделать

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n"; 
+0

Зачем ПП «попробуй это»? ** Хороший ответ ** всегда будет иметь объяснение того, что было сделано, и почему это было сделано именно так, а не только для OP, но для будущих посетителей SO, которые могут найти этот вопрос и прочитать ваш ответ. –

Смежные вопросы