¿Cómo llego NumberFormatter para imprimir los valores de moneda negativos con un signo menos?

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

Pregunta

Estoy usando el NumberFormatter clase PHP para imprimir los valores de moneda .

Por ejemplo:

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

Esto funciona bien, y devuelve "$123.00 ""R$123.00", "£123.00", respectivamente, como se esperaba.

Sin embargo, los números negativos se imprimen "estilo de la contabilidad", entre corchetes, en lugar de un signo menos "-" al.

por ejemplo:

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

Devuelve "($456.00)", mientras que yo quiero "-$456.00". Sin duda, hay una forma sencilla de hacer esto?

I puedo quitar los soportes por override el prefijo y posfijo como sigue:

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

Pero entonces yo no recibo ningún símbolo de moneda por ejemplo "-456.00".

¿Hay algún código de escape para el símbolo de moneda que necesito para usar la hora de establecer el atributo NEGATIVE_PREFIX?

Editar:. Estoy feliz de establecer una configuración regional diferente si eso me da el resultado que estoy buscando

Editar 2: Mirando el Intl docs biblioteca (que es la biblioteca utilizada para implementar NumberFormatter), la siguiente parecía prometedor:

  

¤ (\ u00A4): prefijo o sufijo: Ninguna muestra de divisas, reemplazado por el símbolo de moneda. Si duplicado, sustituido por el símbolo de moneda internacional. Si triplicado, sustituido por divisas nombres plurales, por ejemplo, "dólares de EE.UU." o "dólares estadounidenses" para Estados Unidos. Si está presente en un patrón, el separador decimal monetaria se utiliza en lugar del separador decimal.

Pero esto:

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

A sólo imprime "-¤123", por lo que no hay alegría.

Editar 3: Creo que he encontrado la respuesta, véase más adelante

.
¿Fue útil?

Solución

He encontrado una manera un poco menos hacky para doblar el comportamiento localidad en_US a lo que estoy buscando - la getPattern () / setPattern () funciones .

$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

Otros consejos

Al hacer esto, se están arruinando un poco el punto de la localización. Dado que el ¤ representar el signo de dólar y su están diciendo que su patrón siempre pone el signo en el comienzo de la serie, lo cual no es el caso para cada moneda. Si desea quitar el paréntesis, me gustaría ir algo más 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);

Simplemente se puede hacer

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top