2009-07-21 7 views
4

J'utilise la classe PHP NumberFormatter pour imprimer les valeurs monétaires.Comment obtenir NumberFormatter pour imprimer des valeurs de devise négative avec un signe moins?

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 comptabilité", entouré par des crochets, au lieu . d'un leader moins "-"

par exemple:

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

Renvoie "($456.00)", alors que je veux "-$456.00". Sûrement il y a une manière simple de faire ceci?

Je peux supprimer les crochets par override le préfixe et postfix comme suit:

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

Mais je n'obtenir le symbole monétaire par exemple "-456.00".

Existe-t-il un code d'échappement pour le symbole de devise que j'ai besoin d'utiliser lors de la définition de l'attribut NEGATIVE_PREFIX?

Editer: Je suis heureux de définir un paramètre régional différent si cela me donne le résultat que je recherche.

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

¤ (\ u00A4): le préfixe ou le suffixe: Aucun signe de devises, remplacé par symbole monétaire Si doublé, remplacé par le symbole monétaire international. Si triplé, remplacé par plusieurs noms de devise, par exemple, "dollar américain" ou "dollars américains" pour l'Amérique. S'il est présent dans un modèle, le séparateur décimal monétaire est utilisé à la place du séparateur décimal.

Mais ceci:

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

écrit seulement "-¤123", donc pas de joie.

Édition 3: Je pense avoir trouvé la réponse, voir ci-dessous.

+0

therefromhere: À la lumière de « Je suis heureux de mettre un lieu différent si cela donne mon résultat est ce que je cherche. " Veuillez voir ma réponse mise à jour: utilisez en_AU. – hobodave

Répondre

10

J'ai trouvé un moyen un peu moins hacky de plier le comportement des paramètres régionaux en_US à ce que je cherchais: les fonctions 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

En faisant ainsi, vous êtes en train de ruiner le point de la localisation. Puisque les ¤ représentent le signe du dollar et vous dites que votre modèle met toujours le signe au début du nombre, ce qui n'est pas le cas pour chaque devise.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); 
0

simplement vous pouvez le faire

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

Pourquoi l'OP devrait-il "essayer"? Une ** bonne réponse ** aura toujours une explication de ce qui a été fait et pourquoi cela a été fait, non seulement pour le PO, mais pour les futurs visiteurs du SO qui pourraient trouver cette question et lire votre réponse. –

Questions connexes