我想解析本地货币字符串货币和浮动值。如何更改NumberFormatter :: parseCurrency()接受空白和非破坏空间的行为?
一切运作良好一段时间,现在我们遇到一些问题。看来的NumberFormatter :: parseCurrency使用一个额外的不可见字符:
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
));
输出:
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...
}
正如你所看到的,有在输出3的字符串长度的差异和4.
我在PHP 5.3(启用了mbstring的ubuntu)和5.4(在Mac OS X上的Zend Server)上得到了相同的结果。
的主要问题是,从我的形式(ZF1应用程序)输入值同样与指数4个输出...
有什么建议?在此先感谢
EDIT1:
工作价值的hexdump都:
00000000 38 38 2c 32 32 c2 a0 e2 82 ac 0a |88,22......|
0000000b
hexdump都非工作值:
00000000 38 38 2c 32 32 20 e2 82 ac 0a |88,22 ....|
0000000a
EDIT2:
这似乎是使用白色皮肤的问题。 c2 a0是NO-BREAK SPACE和NumberFormatter :: parseCurrency()所需的(可能?)。但0x20是默认空间(在输入表单中输入)。 当前的解决办法与$value = str_replace("\x20", "\xC2\xA0", $value);
EDIT3替换为NO-BREAK SPACE的空白:
在另一个系统(与Zend服务器5.6,Mac OS X的MBSTRING启用,PHP 5.3.14)一切正常:
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:
与S工作之间的主要区别节奏和非休息空间配置工作是ICU版本:
工作版本:
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
不工作的版本:
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
只是一个想法:格式化程序UTF-8编码(0x20AC)和键盘Latin-1(0x80)中的€符号?据我所知strlen()函数不知道Unicode字符。如果它由var_dump()内部使用,那将解释附加字符。 – CodeZombie 2013-05-08 10:54:13
我的终端应用程序(iTerm2)使用Unicode(UTF-8)作为终端仿真。此外,这种错误/行为发生在浏览器通过html表单文本输入字段的输入数据中。为了澄清,我添加了hexdump输出。 – nofreeusername 2013-05-08 11:05:45
是保存为UTF-8的文件吗? – 2013-05-09 16:23:22