Come faccio ad avere NumberFormatter per stampare i valori di valuta negativi con un segno meno?

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

Domanda

Sto utilizzando il NumberFormatter classe PHP per stampare i valori di valuta .

Esempio:

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

Questo funziona bene, e restituisce "$123.00 ""R$123.00", "£123.00", rispettivamente come previsto.

Ma i numeri negativi sono stampati "stile di contabilità", circondata da parentesi, invece di un meno leader "-".

es:

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

Restituisce "($456.00)", mentre io voglio "-$456.00". Sicuramente c'è un modo semplice di fare questo?

posso rimuovere le staffe dalla sostituzione del prefisso e suffisso come segue:

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

Ma poi non ottengo alcuna moneta simbolo esempio "-456.00".

C'è qualche codice di escape per il simbolo che ho bisogno di usare quando si imposta l'attributo NEGATIVE_PREFIX?

Modifica:. Sono felice di impostare una lingua diversa se che mi dà il risultato che sto cercando

Modifica 2: Guardando il Intl libreria docs (che è la libreria utilizzata per implementare NumberFormatter), il seguente sembrava promettente:

  

¤ (\ u00A4): prefisso o suffisso: Nessun segno di valuta, sostituito da simbolo di valuta. Se raddoppiato, sostituito da simbolo di valuta internazionale. Se triplicato, sostituito da valutarie nomi plurali, per esempio, "dollaro USA" o "dollari" per l'America. Se presenti in un modello, il separatore decimale monetaria viene utilizzato al posto del separatore decimale.

Ma questo:

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

A soli stampe "-¤123", quindi nessuna gioia.

Modifica 3: Credo di aver trovato la risposta, vedi sotto

.
È stato utile?

Soluzione

Ho trovato un modo un po 'meno hacky di piegare il comportamento locale en_US a quello che sto cercando - getPattern () / setPattern () funzioni .

$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

Altri suggerimenti

In questo modo, si sono un pò rovinando il punto della localizzazione. Dal momento che il ¤ rappresentare il simbolo del dollaro e il vostro stanno dicendo che il vostro modello mette sempre il segno all'inizio del numero, che non è il caso per ogni valuta. Se si desidera rimuovere la parentesi, vorrei andare qualcosa di più simile,

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

Semplicemente si può fare

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top