【问题标题】:NumberFormatter::parseCurrency gives different results on machines with same PHP versionNumberFormatter::parseCurrency 在具有相同 PHP 版本的机器上给出不同的结果
【发布时间】:2015-07-14 13:51:39
【问题描述】:

我有一台装有 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

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

【问题讨论】:

  • 所以检查这两个盒子安装了哪些语言环境(locale -a)。国际格式化程序取决于服务器上可用的语言环境
  • ...您可能还想在 ->parseCurrency() 之后查看if ( false===$res ) { echo $formatter->getErrorMessage(); } 的输出。 (但首先要研究的是语言环境)
  • 两台机器具有相同的语言环境。 Wheezy 有效,但 Jessie 给出了 U_PARSE_ERROR。查看我的编辑。

标签: php formatting debian icu php-5.6


【解决方案1】:

我已经找到了问题所在。我发布的代码有问题,不应该以任何方式工作。正确的代码是这样的:

$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 解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2016-04-22
    • 2019-03-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多