Como faço para que o número -formatter imprima valores de moeda negativa com um sinal de menos?

StackOverflow https://stackoverflow.com/questions/1160860

Pergunta

Estou usando o PHP NumberFormatter classe para imprimir valores da moeda.

Por exemplo:

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

Isso funciona bem, e retorna "$123.00", "R$123.00", "£123.00"respectivamente como esperado.

Mas os números negativos são impressos "estilo de contabilidade", cercados por colchetes, em vez de uma liderança menos "-".

por exemplo:

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

Retorna "($456.00)", enquanto eu quero "-$456.00". Certamente há uma maneira simples de fazer isso?

Eu posso remover os colchetes substituindo o prefixo e o postfix da seguinte forma:

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

Mas então eu não tenho símbolo de moeda, por exemplo "-456.00".

Existe algum código de escape para o símbolo da moeda que eu preciso usar ao definir o atributo negativo_prefix?

Editar: Fico feliz em definir um local diferente, se isso me der o resultado que estou procurando.

Editar 2: Olhando para o DOCs da biblioteca INTL (que é a biblioteca usada para implementar o NumberFormatter), o seguinte parecia promissor:

¤ ( u00A4): prefixo ou sufixo: sem sinal de moeda, substituído pelo símbolo da moeda. Se dobrado, substituído pelo símbolo da moeda internacional. Se triplicado, substituído por nomes plurais de moeda, por exemplo, "dólares americanos" ou "dólares americanos" para a América. Se presente em um padrão, o separador decimal monetário é usado em vez do separador decimal.

Mas isso:

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

Apenas imprime "-623", então não há alegria.

Editar 3: Acho que encontrei a resposta, veja abaixo.

Foi útil?

Solução

Encontrei uma maneira um pouco menos hacky de dobrar o comportamento do local do local do EN_US para o que estou procurando - o getPattern () / conjunto padrão() funções.

$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

Outras dicas

Ao fazer isso, você está meio que arruinando o ponto da localização. Como o ¤ representa o sinal do dólar e você está dizendo que seu padrão sempre coloca o sinal no início do número, o que não é o caso de cada moeda. Se você quiser remover os parênteses, eu iria algo mais parecido,

$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);

Simplesmente você pode fazer

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top