Сравнение результатов PHP NumberFormatter::formatCurrency

У меня проблемы с модульным тестированием библиотеки, использующей 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 на каждом языке. Но как тогда я могу сравнить эти строки?


person AntonioHS    schedule 14.07.2015    source источник
comment
Чтобы пройти тесты, мне пришлось фактически повторить результат $actual, а затем скопировать и вставить ожидаемые значения из dataProvider. Но это не приемлемое решение, на мой взгляд.   -  person AntonioHS    schedule 14.07.2015
comment
да проблема в том, что пространство закодировано разными кодировками... вместо шестнадцатеричного значения 20 вы получаете a0   -  person Miguel    schedule 06.06.2016
comment
Я знаю, что эта проблема немного устарела, но на самом деле у меня похожая проблема с использованием NumberFormatter. Что мне удалось расшифровать, так это то, что на данный момент NumberFormatter::formatCurrency() фактически возвращает строку со скрытыми символами, поэтому они кажутся одинаковыми, но на самом деле имеют разную длину строки. Я смог выяснить это, пропустив ожидаемые и фактические результаты через utf8encode. К сожалению, я еще не смог найти чистое решение. Вам когда-нибудь удавалось придумать что-нибудь?   -  person Graham S.    schedule 02.03.2017
comment
Я сделал то, что объяснил в первом комментарии, а потом просто забыл об этом. Извините, я не могу больше помочь.   -  person AntonioHS    schedule 07.03.2017
comment
@GrahamS., ты тем временем нашел решение? Я борюсь с той же проблемой в настоящее время.   -  person olidem    schedule 18.07.2018


Ответы (1)


Я нашел решение. PHP NumberFormatter вставляет специальный символ пробела, так называемый No-Break-Space (возможно, вы знаете  ).

если вы конвертируете прочитанное значение

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

все будет отлично.

person olidem    schedule 18.07.2018