NumberFormatter::parseCurrency在相同PHP版本的机器上给出不同的结果


NumberFormatter::parseCurrency gives different results on machines with same PHP version

我有一台安装了Debian Jessie和PHP 5.6.9的机器,还有一台安装了Debian Wheezy的机器,使用了相同的PHP版本(但来自dotdeb.org)。

下面这段代码在两台机器上给出了不同的结果:

$value = '900,00';
$cur = 'EUR';
$formatter = new 'NumberFormatter('nl_NL', 'NumberFormatter::TYPE_CURRENCY);
$formatter->setPattern('#,##0.00;#,##0.00-');
$res = $formatter->parseCurrency($value, $cur);
var_dump($res);
var_dump($formatter->getErrorMessage());

Debian Weezy输出:

float(900) string(12) "U_ZERO_ERROR"

Debian Jessie的输出:

bool(false) string(36) "Number parsing failed: U_PARSE_ERROR"

两台机器都安装了php5-intl。两台机器都安装了libicu (wheezy上是libicu48, Jessie上是libicu52)。两台机器都有相同的可用区域设置:

$ locale -a
C
C.UTF-8
en_US.utf8
POSIX

而且,我无法在3v4l.org上复制它。在所有PHP版本中,我得到一个解析错误:http://3v4l.org/XgsBu

有什么问题吗?为什么结果不一致?

我已经找出问题所在了。我张贴的代码是错误的,不应该有任何方式工作。正确的代码是:

$value = '900,00';
$formatter = new 'NumberFormatter('nl_NL', 'NumberFormatter::DECIMAL);
$formatter->setPattern('#,##0.00;#,##0.00-');
$res = $formatter->parse($value, 'NumberFormatter::TYPE_DOUBLE);
var_dump($res);
var_dump($formatter->getErrorMessage());

错误:

  • 第二个构造函数参数不应该是TYPE_*常量之一。这些是parse方法。
  • 货币解析器需要一个货币符号。因为我的值没有一个,我应该使用DECIMAL解析器代替。