Ich versuche, lokalisierte Währungszeichenfolgen auf Währung und Gleitkommawert zu analysieren.
Alles funktioniert gut für eine Weile, jetzt haben wir einige Probleme. Es scheint, dass NumberFormatter :: parseCurrency ein zusätzliches unsichtbares Zeichen verwendet:
Testcode:
%Vor%Ausgabe:
%Vor%Wie Sie sehen können, gibt es einen Unterschied in der Stringlänge von Ausgabe 3 und 4.
Ich bekomme die gleichen Ergebnisse in PHP 5.3 (ubuntu mit aktiviertem mbstring) und 5.4 (Zend Server unter Mac OS X).
Das Hauptproblem ist, dass Eingabewerte aus meinem Formular (ZF1-Anwendung) gleichermaßen mit dem Index 4 ...
ausgegeben werden sollenirgendwelche Vorschläge? Vielen Dank im Voraus
Bearbeiten1:
hexdump des Arbeitswertes:
%Vor%hexdump von nicht funktionierendem Wert:
%Vor%Bearbeiten2:
Es scheint ein Problem mit dem verwendeten Whiteplace zu sein. c2 a0 ist NO-BREAK SPACE und (vielleicht?) erforderlich von NumberFormatter :: parseCurrency (). aber 0x20 ist der Standardbereich (der im Eingabeformular eingegeben wird).
Die aktuelle Problemumgehung ersetzt den Leerraum durch NO-BREAK SPACE mit $value = str_replace("\x20", "\xC2\xA0", $value);
Bearbeiten3:
Auf einem anderen System (Mac OS X mit Zend Server 5.6, mbstring aktiviert, PHP 5.3.14) funktioniert alles wie erwartet:
%Vor%Bearbeiten4:
Der Hauptunterschied zwischen der Arbeit mit Space und der Arbeit mit der non-break Space-Konfiguration ist die ICU-Version:
Arbeitsversion:
%Vor%nicht funktionierende Version:
%Vor% NumberFormatter::parseCurrency
ist ein dünner Wrapper um die ICU-Bibliotheksfunktion unum_parseDoubleCurrency
( siehe Quelle ).
Die ICU-Bibliotheksfunktion ist insofern restriktiv, als sie nur Strings analysiert, die sich aus ihrer Doppelfunktion unum_formatDoubleCurrency
ergeben würden. Das Format wird durch die Unicode-Ländereinstellungsdaten gesteuert, die einen nicht brechenden Abstand zwischen dem Währungswert und dem numerischen Wert angeben. Offensichtlich akzeptiert die frühere Version der Bibliothek andere Leerzeichen.
Kurz gesagt, Sie können NumberFormatter::parseCurrency
keine Leerzeichen akzeptieren. % Co_de% sollte jedoch standardmäßig auch nicht-brechende Leerzeichen ausgeben:
Die Frage ist, welcher Teil Ihrer Anwendung einen Raum ausgibt und wie Sie ihn ansprechen. Sie erwähnen, dass es sich um einen Teil Ihres Formulars handelt. Vielleicht könnten Sie also darauf achten, dass das Formular die Währung und den Wert als separate Felder zurückgibt, sodass Sie sich keine Gedanken über die Analyse der Zahl machen müssen. Wenn der Benutzer die Zeichenfolge "88,22 €" selbst eingibt, könnten möglicherweise mehr Probleme als nur das Leerzeichen auftreten. Allerdings ist die von Ihnen erwähnte Problemumgehung (die Zend_Currency
durch \x20
ersetzt) die einzige Möglichkeit, das Problem zu beheben, wenn Sie \xc2\xa0
verwenden möchten.
Tags und Links php icu intl numberformatter