Comment puis-je obtenir NumberFormatter pour imprimer des valeurs monétaires négatives avec un signe moins?

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

Question

J'utilise PHP NumberFormatter classe pour imprimer des valeurs monétaires .

Par exemple:

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

Cela fonctionne très bien, et retourne "$123.00 ""R$123.00", "£123.00 » respectivement comme prévu.

Mais les nombres négatifs sont imprimés « style de comptabilité », entouré par des crochets, au lieu d'un premier moins « - ».

par exemple:

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

Retourne "($456.00)", alors que je veux "-$456.00". Certes, il y a un moyen simple de le faire?

Je peux supprimer les crochets par remplacement du préfixe et suffixe comme suit:

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

Mais alors je ne reçois pas le symbole monétaire par exemple "-456.00".

Y at-il un code d'échappement pour le symbole monétaire que je dois utiliser lors de la définition de l'attribut NEGATIVE_PREFIX?

Edit:. Je suis heureux de mettre un lieu différent si cela me donne le résultat que je suis à la recherche

Edit 2: En regardant le Intl bibliothèque docs (ce qui est la bibliothèque utilisée pour mettre en œuvre NumberFormatter), ce qui suit semblaient prometteurs:

  

¤ (\ u00A4): préfixe ou un suffixe: Aucun signe de devises, remplacé par le symbole monétaire. Si doublé, remplacé par le symbole monétaire international. Si triplé, remplacé par devises noms pluriel, par exemple, « dollar américain » ou « dollars » pour l'Amérique. Si elle est présente dans un motif, le séparateur décimal monétaire est utilisé au lieu du séparateur décimal.

Mais ceci:

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

Juste imprime "-¤123", donc pas de joie.

Edit 3: Je pense avoir trouvé la réponse, voir ci-dessous

.
Était-ce utile?

La solution

Je l'ai trouvé un moyen de plier un peu moins hacky le comportement de en_US à ce que je suis à la recherche - getPattern () / setPattern () fonctions .

$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

Autres conseils

En faisant cela, vous ruinent un peu le point de la localisation. Depuis ¤ représentent le signe du dollar et vous êtes dire que votre modèle met toujours le signe au début du numéro, ce qui est le cas pour toutes les monnaies. Si vous souhaitez supprimer la parenthèse, je voudrais aller quelque chose comme,

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

Il suffit que vous pouvez faire

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top