Ich versuche lokalisierte Währungszeichenfolgen zu Währung und Gleitkommawert zu analysieren.Wie kann ich das NumberFormatter :: parseCurrency() - Verhalten zum Akzeptieren von Leerraum und nicht brechendem Leerraum ändern?
Alles funktioniert gut für eine Weile, jetzt haben wir einige Probleme. Es scheint, dass NumberFormatter :: parseCurrency ein zusätzliches unsichtbaren Zeichen verwendet:
Testcode:
<?php
$formatter = new NumberFormatter("de_DE", NumberFormatter::CURRENCY);
var_dump(array(
$formatter->parseCurrency("88,22 €", $curr), // taken from output of $formatter->format(88.22)
$formatter->parseCurrency("88,22 €", $curr), // input with keyboard
$formatter->parseCurrency("88,22 \xE2\x82\xAc", $curr), // just a test
$formatter->format(88.22),
"88,22 €" // keyboard input
));
Ausgang:
array(5) {
[0]=> float(88,22)
[1]=> bool(false)
[2]=> bool(false)
[3]=> string(10) "88,22 €" // this as input works
[4]=> string(9) "88,22 €" // this not...
}
Wie Sie sehen können, gibt es einen Unterschied in der Stringlänge von Ausgang 3 und 4.
Ich bekomme die gleichen Ergebnisse in PHP 5.3 (Ubuntu mit Mbstring aktiviert) und 5.4 (Zend Server unter Mac OS X).
Das Hauptproblem ist, Eingabewerte von meiner Form (ZF1 Application) sind ebenso zur Ausgabe mit Index 4 ...
irgendwelche Vorschläge? Vielen Dank im Voraus
Edit1:
hexdump Arbeitswert:
00000000 38 38 2c 32 32 c2 a0 e2 82 ac 0a |88,22......|
0000000b
hexdump Nichtarbeitswert:
00000000 38 38 2c 32 32 20 e2 82 ac 0a |88,22 ....|
0000000a
Edit2:
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). Aktuelle Problemumgehung wird mit $value = str_replace("\x20", "\xC2\xA0", $value);
Edit3 den Leerraum mit NO-BREAK SPACE ersetzt:
auf einem anderen System (Mac OS X mit Zend Server 5.6, aktiviert mbstring, PHP 5.3.14) alles wie erwartet funktioniert :
array(5) {
[0]=> float(88,22)
[1]=> float(88,22)
[2]=> float(88,22)
[3]=> string(9) "88,22 €"
[4]=> string(9) "88,22 €"
}
Edit4:
Der Hauptunterschied zwischen den Arbeits s Tempo und mit nicht Pause Raumkonfiguration arbeitet, ist die ICU-Version:
Arbeitsversion:
intl
Internationalization support => enabled
version => 1.1.0
ICU version => 3.8.1
Directive => Local Value => Master Value
intl.default_locale => no value => no value
intl.error_level => 0 => 0
nicht funktionierende Version:
intl
Internationalization support => enabled
version => 1.1.0
ICU version => 4.8.1.1
ICU Data version => 4.8.1
Directive => Local Value => Master Value
intl.default_locale => no value => no value
intl.error_level => 0 => 0
Nur eine Idee: Ist das € -Zeichen vom Formatierer UTF-8 codiert (0x20AC) und das von der Tastatur Latin-1 (0x80)? Soweit ich weiß, kennt die Funktion strlen() keine Unicode-Zeichen. Wenn es intern von var_dump() verwendet wird, würde das das zusätzliche Zeichen erklären. – CodeZombie
Meine Terminal-App (iTerm2) verwendet Unicode (UTF-8) als Terminal-Emulation. Dieser Fehler/dieses Verhalten geschieht auch aus Eingabedaten des Browsers über HTML-Formular-Texteingabefelder. Ich habe die Hexdump-Ausgabe zur Verdeutlichung hinzugefügt. – nofreeusername
ist die Datei als UTF-8 gespeichert? –