Come faccio ad avere NumberFormatter per stampare i valori di valuta negativi con un segno meno?
-
18-09-2019 - |
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
.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";