Возьмите следующий код:
$formatter = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency('-1.23', 'EUR');
На Fedora 25 вывод -1,23 €
, который является выходом, который я ожидал.
Однако на CentOS 7 вывод (1,23 €)
; не совсем ясно для французской аудитории.
Откуда эти различия? Я подозреваю, что они пришли из libicu
Версия установлена в системе, но мне нужно подтверждение об этом. Также я не уверен, использует ли PHP версию ICU, установленную в системе, или версию, которая поставляется во время компиляции.
CentOS 7 имеет libicu-50.1.2-15
и Fedora 25 имеет libicu-57.1-4
, но версии PHP одинаковы в обеих системах, и все пакеты приходят из одного и того же хранилища (Remi), так что если бы ICU был в комплекте с PHP, я бы ожидал, что их версии будут идентичны.
PHP в репозитории «remi» (и AFAIK для всех сторонних репозиториев) использует системную библиотеку libicu, поскольку в PHP нет встроенной библиотеки libicu.
(единственное исключение в пакетах в remi-репозитории для EL-6, которые используют libicu 50, перенесены из EL-7 вместо 4.2 по умолчанию)
Возможное решение, настройка шаблона вывода:
$formatter = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
$p = $formatter->getPattern(); // "#,##0.00 ¤;(#,##0.00 ¤)"$p = explode(";", $p, 2);
$formatter->setPattern($p[0]); // "#,##0.00 ¤"echo $formatter->formatCurrency('-1.23', 'EUR');
Протестировано на Fedora 25 (icu 58) и RHEL-7 (icu 50):
От Документация ICU — десятичный формат — подробное описание
Если нет явного отрицательного подшаблона, то отрицательный подшаблон
является локализованным знаком минус с префиксом положительного подшаблона.