php - 比较 PHP 的 NumberFormatter::formatCurrency 结果

标签 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 代码有关。但是我如何比较这些字符串呢?

最佳答案

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

如果转换读取值

str_replace("\xc2\xa0", " ", $actual);

一切都会好起来的。

关于php - 比较 PHP 的 NumberFormatter::formatCurrency 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31404351/

相关文章:

ruby-on-rails - 符合 I18n 标准的中文语言环境

ios - 如何对特定于语言环境的本地通知进行单元测试

php - 在 mysqli 中更改主机属性

php - 通过两个ID对查询搜索进行排序然后合并

php - 我需要在哪里放置文件 composer.json 以便 Composer 与 Symfony 一起工作

vba - 外文字符显示为??????在VBA 2003中,如何设置UTF-8?

php - 带有选择的下拉列表

php - substr() 外来字符给我带白色问号的黑色菱形

PHP序列化/反序列化错误

c++ - 如何从 systeminfo.exe 显示的区域设置字符串中检索 "Human Readable"字符串?