Почему суммы в швейцарских франках в PHP NumberFormatter округляются до никеля?

Используя метод formatCurrency() в _ 2_ класс с валютой CHF (швейцарские франки) округляет суммы до ближайшего никеля (0,05) для меня.

Код:

$formatter = new \NumberFormatter('en_US', \NumberFormatter::CURRENCY);
echo $formatter->formatCurrency('12.34', 'CHF');

Результат:

12,35 швейцарского франка

Обратите внимание, что числовое значение 12,34 округляется до 12,35. Сначала я подумал, что потенциально это было ожидаемым и новым способом обращения с деньгами, с которым я не знаком. Оказывается, это не так, как должно работать. (https://money.stackexchange.com/q/105014/81599)

Почему в PHP оно округляется в большую / меньшую сторону до ближайшего никеля и как это исправить?


person 1000Nettles    schedule 11.02.2019    source источник


Ответы (1)


На самом деле ответ лежит за пределами PHP, в библиотеке ICU, которую PHP оборачивает через Расширение интернационализации. Как оказалось, у меня была устаревшая версия (50.x) библиотеки ICU, в которой была ошибка округления никеля. Обновление до ближайшей библиотеки ICU (на сегодняшний день 63.1) позволит вам использовать самые современные стандарты интернационализации, включая это исправление. Я не уверен, какое конкретное обновление ICU устранило мою проблему, но я знаю, что последнее исправляет это.

Что касается того, почему это произошло в первую очередь, Швейцария постепенно отказалась от номинала 0,01 в своей валюте, а наименьший номинал на самом деле составляет 0,05 с денежными суммами. Возможно, разработчики, которые работают над ICU, запутались, прочитав, скажем, эту диаграмму Unicode. может сначала показаться вводящим в заблуждение.

Связанный:

person 1000Nettles    schedule 11.02.2019