比较 PHP 的 NumberFormatter::formatCurrency 结果
Comparing PHP's NumberFormatter::formatCurrency results
我在对使用 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插入了一个特殊的space字符,即所谓的No-Break-Space(也许你知道
)。
如果转换读取值
str_replace("\xc2\xa0", " ", $actual);
一切都会好起来的。
我在对使用 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插入了一个特殊的space字符,即所谓的No-Break-Space(也许你知道
)。
如果转换读取值
str_replace("\xc2\xa0", " ", $actual);
一切都会好起来的。