我正在尝试解析本地化货币字符串以获取货币和浮点值。
一切都进行得很顺利,现在我们遇到了一些问题。似乎NumberFormatter :: parseCurrency使用了一个额外的不可见字符:
测试代码:
<?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的字符串长度存在差异。
我在启用了mbstring的Ubuntu上的PHP 5.3和Mac OS X上的Zend服务器上的PHP 5.4中获得了相同的结果。
主要问题是来自我的表单(ZF1应用程序)的输入值与索引4的输出相等......
有什么建议吗?提前感谢。
编辑1:
工作值的十六进制转储:
00000000 38 38 2c 32 32 c2 a0 e2 82 ac 0a |88,22......|
0000000b
无法工作值的十六进制转储:
00000000 38 38 2c 32 32 20 e2 82 ac 0a |88,22 ....|
0000000a
编辑2:
这似乎是使用的空格符有问题。c2a0是“NO-BREAK SPACE”,(可能?)NumberFormatter :: parseCurrency()需要它,但0x20是默认空格符(输入表单中输入的)。目前的解决方法是使用NO-BREAK SPACE替换空格符,使用$value = str_replace("\x20", "\xC2\xA0", $value);
编辑3:
在另一个系统(Mac OS X与Zend Server 5.6一起使用,启用了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 €"
}
编辑4:
使用空格和不间断空格配置所需的主要区别在于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