Frage

Ich bin mit der PHP NumberFormatter Klasse Währungswert drucken .

Beispiel:

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

Das funktioniert gut und gibt "$123.00 ""R$123.00", "£123.00“jeweils als erwartet.

Aber negative Zahlen gedruckt „Buchhaltung Stil“, die von Klammern umgeben, anstelle einem führenden minus „-“.

Beispiel:

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

Gibt "($456.00)", während ich "-$456.00" wollen. Sicherlich gibt es eine einfache Möglichkeit, dies zu tun?

Ich kann die Klammern durch Überschreibung entfernen Sie das Präfix und Postfix wie folgt:

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

Aber dann bekomme ich kein Währungssymbol zB "-456.00".

Gibt es einen Escape-Code für das Währungssymbol, das ich verwenden müssen, wenn die NEGATIVE_PREFIX Attribut Einstellung?

Edit:. Ich bin glücklich, eine andere Locale zu setzen, wenn das mir das Ergebnis gibt, die ich suche

Edit 2: Mit Blick auf die Intl Bibliothek docs (die die Bibliothek verwendet NumberFormatter zu implementieren), die folgende sah vielversprechend aus:

  

¤ (\ u00A4): Präfix oder Suffix: Nein Währungszeichen, durch Währungssymbol ersetzt. Wenn verdoppelt, durch internationales Währungssymbol ersetzt. Wenn verdreifacht, nach Währungen Plural Namen ersetzt, beispielsweise „US-Dollar“ oder „US-Dollar“ für Amerika. Wenn in einem Muster, das Geld Dezimaltrennzeichen anstelle des Dezimaltrennzeichens verwendet.

Aber diese:

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

Just prints "-¤123", also keine Freude.

Bearbeiten 3: Ich denke, dass ich die Antwort gefunden, siehe unten

.
War es hilfreich?

Lösung

Ich habe einen etwas weniger hacky Weg gefunden, das en_US locale Verhalten zu biegen, was ich suche - die getPattern () / setPattern () Funktionen.

$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

Andere Tipps

Auf diese Weise Sie ruinieren irgendwie den Punkt der Lokalisierung. Da die ¤ repräsentieren das Dollarzeichen und Ihr sagen, dass Ihr Muster setzt immer das Zeichen am Anfang der Nummer, die für jede Währung nicht der Fall ist. Wenn Sie die Klammer entfernen möchten, würde ich etwas mehr wie, gehen

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

Einfach können Sie tun,

$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top