Wie kann ich das NumberFormatter :: parseCurrency () - Verhalten zum Akzeptieren von Leerraum und nicht brechendem Leerraum ändern?

9

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 sollen

irgendwelche 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%     
nofreeusername 08.05.2013, 10:24
quelle

1 Antwort

3

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:

%Vor%

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.

    
cmbuckley 12.05.2013, 16:07
quelle

Tags und Links