Различия в форматировании валюты с использованием Number.toLocaleString () - PullRequest
2 голосов
/ 09 мая 2019

Я искал форматирование числа с поддержкой локали для javascript, и нашел , что Number.toLocaleString и расширение Intl.NumberFormat , кажется, хорошие решения для этой проблемы.

В частности, я бы предпочел строить поверх уже реализованных абстракций для специфичного для локали форматирования, а не изобретать колесо и придумывать еще одно решение уже решенной проблемы.


Итак, я позвонил Number.toLocaleString в некоторых различных средах javascript и обнаружил, что форматирование валюты, похоже, изменилось:

(5).toLocaleString('fr-CH', {currency: 'CHF', style: 'currency'});
// Node v10.15.1:  'CHF 5.00'
// Node v12.1.0:   '5.00 CHF'
// Firefox 66.0.2: '5.00 CHF'
// Chrome 73.0.…:  '5.00 CHF'
// Safari 12.0.3:  '5.00 CHF'
// IE 11:          '5.00 fr.'
  • IE 11 отличается от остальных, но меня это не удивляет, учитывая его возраст.
  • Что меня удивляет, так это то, что форматирование для CHF в fr-CH изменилось между версиями узлов 10 и 12.
  • Для сравнения я взглянул на настройки glibc LC_MONETARY для fr_CH и обнаружил, что, кажется, он ставит CHF перед значением, по крайней мере, примерно 1997. Это особенно запутывает, что положение CHF, похоже, отличается для большинства современных браузеров.

Я хотел бы знать и понимать:

  1. Почему позиции CHF отличаются в этих случаях?
    • Я знаю, что это может зависеть от доступных системных локалей или браузера. Но изменение между версиями узла, кажется, указывает на более недавнее и добровольное изменение для меня.
  2. Есть ли правильный способ размещения CHF или оба варианта приемлемы для CH, или, более конкретно, fr-CH?
    • Для этого было бы прекрасно иметь реальный источник, такой как бумага или исследовательская база данных, а не слухи или анекдоты.

Обновление (2019-05-16):

В ответ на мой частичный ответ Я бы хотел указать:

  • Решение о форматировании для fr_CH указано как currencyFormat{"#,##0.00 ¤ ;-#,##0.00 ¤"} в коммите 3bfe134 , но мне все еще не хватает источника для решения, и я хотел бы узнать об этом.

1 Ответ

3 голосов
/ 16 мая 2019

Итак, я проверил источник v8 , чтобы посмотреть, смогу ли я найти, где определяется поведение Number.toLocaleString.

  • В builtins-number.cc я нашелBUILTIN(NumberPrototypeToLocaleString){…}, который использует Intl::NumberToLocaleString(…).
  • Это привело меня к intl-objects.cc, который реализует Intl::NumberToLocaleString, используя icu::number::LocalizedNumberFormatter.

Поскольку v8 использует icu Я проверил источник , чтобы продолжить поиск.

  • Моя первая попытка найти источник форматирования чисел заставила меня взглянуть на decimfmt и numfmt сначала, но я почему-то продолжал терять след.
  • Затем меня осенило, что, вероятно, имеет смысл отделить определения формата от остальной части кода.Просматривая веб-сайт и больше источников, я наконец нашел icu4c/source/data/locales/de_CH.txt и icu4c/source/data/locales/fr_CH.txt.
    • de_CH.txt имеет currencyFormat{"¤ #,##0.00;¤-#,##0.00"}.
    • fr_CH.txt имеет currencyFormat{"#,##0.00 ¤ ;-#,##0.00 ¤"}.
  • Теперь, используя git, я нашел коммит, которыйВпервые введен currencyFormat для fr_CH ( 3bfe134 ) 19 месяцев назад.
    • Вероятно, это будет между узлом v10 и v12.
    • Я также вижу, что было бы разумно использовать откат на de_CH до добавления curreencyFormatна fr_CH и, следовательно, видим, что формат изменится так же, как и он.

В комитете упоминается альфа-версия CLDR 32, и я нашел диаграмму CLDR версии 32.Однако в настоящее время я не могу выяснить, где находится диаграмма, определяющая currencyFormat для fr_CH.

. Я чувствую, что, найдя изменение в fr_CH currencyFormat, которое я нашел ипонять изменения, которые приводят к изменению поведения между различными версиями узлов.

На данный момент я не понимаю, почему glibc и icu имеют здесь различия, но это то, что я могу спросить вконтекст конкретных проектов для.

У меня сложилось впечатление, что мне все еще не хватает конкретного решения или точки данных, которая привела к реализации currencyFormat - если я найду его, я добавлю еговот и будьте довольны.

Обновление 2019-05-18:

  • Данные CLDR 32 можно найти в разделе загрузки по адресу cldr.unicode.org ,
    • С там Я мог бы загрузить cldr-common-32.zip, который включал файл common/main/fr_CH.xml, в котором формат валюты определен следующим образом:
<currencyFormats numberSystem="latn">
  <currencyFormatLength>
    <currencyFormat type="standard">
      <pattern draft="contributed">#,##0.00 ¤ ;-#,##0.00 ¤</pattern>
    </currencyFormat>
  </currencyFormatLength>
</currencyFormats>
  • Через cldr.unicode.org Я также нашел инструмент опроса, который используется для принятия решений по этим вопросам и для документирования результатов таких решений.

Screenshot of number formatting decisions for fr_CH

Обновление 2019-05-21:

Так что из любопытства я спросил об этом в списке libc-locales , а также в Ближайший билет Я мог найти в системе заявок Unicode-Org.

Это побудило меня к дальнейшему расследованию, и, исследуя это с другом, мы наткнулись на cldr repo на Github, которыйфокусируется на данных CLDR, а не на данных, связанных с CLDR, как в icu.

Мы обнаружили, что commit c5e7787 представил первое изменение, которое привело к размещению CHF после числаа не до этого и через этот коммит стало лучше знать о двух билетах.Это билеты CLDR-9370 и CLDR-10755 , второй из которых является продолжением, которое устраняет некоторое форматирование.

На поверхности CLDR-9370похоже, в основном обсуждается десятичный разделитель, также обсуждается размещение символа валюты.

Одним из приведенных источников является руководство по типографике (pdf) , опубликованное ЦЕРН, в котором содержатся подробные инструкции поспособы записи чисел.

Для CHF примечания к руководству: Screenshot from the CERNs typography guide, the section on writing sums of money

Использование Google Translate переводит:

Написание денежных сумм

Число записывается с шагом в три цифры, разделенныхнеразрывный пробел (без точки или апостроф разделения), и является сопровождается (и никогда не предшествует) указанием валюты длинный или сокращенный. Для названия сокращений валют мы используем ISO Код.

...