2017-02-05 2 views
0

Nehmen Sie den folgenden Code ein:NumberFormatter :: Formatcurrency() -Ausgabe auf verschiedenen Plattformen

$formatter = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY); 
echo $formatter->formatCurrency('-1.23', 'EUR'); 

auf Fedora 25, der Ausgang ist -1,23 €, die die Ausgabe ich erwarten würde.

Auf CentOS 7 ist jedoch der Ausgang (1,23 €); nicht ganz explizit für ein französisches Publikum.

Woher kommen diese Unterschiede? Ich vermute, dass sie von der libicu Version kommen, die auf dem System installiert ist, aber ich brauche eine Bestätigung darüber. Ich bin mir auch nicht sicher, ob PHP die auf dem System installierte ICU-Version verwendet oder eine Version, die zur Kompilierungszeit gebündelt ist.

CentOS 7 hat libicu-50.1.2-15 und 25 Fedora hat libicu-57.1-4, aber PHP-Versionen sind die auf beiden Systemen gleich, und alle Pakete aus demselben Repository (remi), so dass, wenn ICU mit PHP gebündelt wurde, würde ich ihre Versionen erwarten identisch sein.

Antwort

1

PHP im "remi" -Repository (und AFAIK alle 3rd-Party-Repositories) verwendet System libicu, da es in PHP keine gebündelte libicu gibt.

(die einzige Ausnahme in Paketen in remi Repository für EL-6, die libicu 50 verwenden, zurück portiert von EL-7 anstelle von Standard 4.2)

+0

Danke Remi, ich hatte nicht erwartet, eine Antwort von Ihnen persönlich zu bekommen :) Dies verdeutlicht, welche libicu Version PHP verwendet. Denkst du, dass mein Problem dann definitiv mit der libicu-Version zusammenhängt? – Benjamin

+0

Ja, sehr wahrscheinlich –

+0

Danke. Ich versuche, 'libicu' zu aktualisieren, um dies zu überprüfen, aber ich habe Probleme, ein aktualisiertes' libicu'-Paket zu finden, das mit CentOS 7 kompatibel ist. Falls Sie interessiert sind, habe ich [diese Frage zu unix.stackexchange gestellt] (http://unix.stackexchange.com/q/342918/30018). – Benjamin

1

mögliche Abhilfe, Einstellen Ausgabemuster:

$formatter = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY); 
$p = $formatter->getPattern(); // "#,##0.00 ¤;(#,##0.00 ¤)" 
$p = explode(";", $p, 2); 
$formatter->setPattern($p[0]); // "#,##0.00 ¤" 
echo $formatter->formatCurrency('-1.23', 'EUR'); 

getestet auf Fedora 25 (ICU 58) und RHEL-7 (ICU 50):

Von ICU Documentation - Decimal Format - Detailed description

Wenn es kein explizites negatives Untermuster gibt, ist das negative Untermuster das lokalisierte Minuszeichen, das dem positiven Untermuster vorangestellt ist.

+0

Danke, das würde funktionieren, aber meine App verwendet mehrere Währungen/Gebietsschemas, und ich möchte nicht eine Liste der Formatierer führen müssen. Ich werde besser auf Fedora umsteigen, was heutzutage für den Server ziemlich in Ordnung ist. – Benjamin

+0

Dieser Code ist ziemlich allgemein, es fallen nur die zweiten optionalen Muster für negative Werte. –

+0

Interessant. Das könnte funktionieren, vorausgesetzt, dass andere Locales die Klammern für negative Zahlen nicht erwarten. Ich werde diesen Code im Hinterkopf behalten, es kann definitiv nützlich sein. – Benjamin

Verwandte Themen