比较PHP的NumberFormatter :: formatCurrency结果

时间:2015-07-14 10:42:16

标签: php utf-8 locale number-formatting currency-formatting

我在使用NumberFormatter :: formatCurrency的单元测试时出现问题。经过一些反复试验,我已将问题缩小到这个测试用例:

/**
 * @dataProvider getLocales()
 */
public function test($locale, $expected)
{
    $number_formatter = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
    $actual = $number_formatter->formatCurrency(3000.05, 'EUR');
    $this->assertEquals($expected, $actual, $locale.' failed');
}

public function getLocales()
{
    return array(
        array('en_US', '€3,000.05'),
        array('fr_FR', '3 000,05 €'),
        array('de_DE', '3.000,05 €'),
    );
}

结果是:

fr_FR failed
Failed asserting that two strings are equal.
Expected :3 000,05 €
Actual   :3 000,05 €


de_DE failed
Failed asserting that two strings are equal.
Expected :3.000,05 €
Actual   :3.000,05 €

正如您所看到的,失败的测试似乎具有相同的字符串,因此它应该是区域设置的问题。

我尝试与strcoll进行比较,在比较之前设置区域设置,以及其他没有运气的组合。

我想这与每种语言中不同的utf-8代码有关。但是我怎么能比较这些字符串呢?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 PHP的NumberFormatter插入一个特殊的空格字符,即所谓的No-Break-Space(也许您知道str_replace("\xc2\xa0", " ", $actual); )。

如果您转换读取值

pred

一切都会好起来的。