Итак, я проверил источник 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 Я также нашел инструмент опроса, который используется для принятия решений по этим вопросам и для документирования результатов таких решений.
Обновление 2019-05-21:
Так что из любопытства я спросил об этом в списке libc-locales , а также в Ближайший билет Я мог найти в системе заявок Unicode-Org.
Это побудило меня к дальнейшему расследованию, и, исследуя это с другом, мы наткнулись на cldr repo на Github, которыйфокусируется на данных CLDR, а не на данных, связанных с CLDR, как в icu.
Мы обнаружили, что commit c5e7787 представил первое изменение, которое привело к размещению CHF
после числаа не до этого и через этот коммит стало лучше знать о двух билетах.Это билеты CLDR-9370 и CLDR-10755 , второй из которых является продолжением, которое устраняет некоторое форматирование.
На поверхности CLDR-9370похоже, в основном обсуждается десятичный разделитель, также обсуждается размещение символа валюты.
Одним из приведенных источников является руководство по типографике (pdf) , опубликованное ЦЕРН, в котором содержатся подробные инструкции поспособы записи чисел.
Для CHF
примечания к руководству:
Использование Google Translate переводит:
Написание денежных сумм
Число записывается с шагом в три цифры, разделенныхнеразрывный пробел (без точки или апостроф разделения), и является
сопровождается (и никогда не предшествует) указанием валюты
длинный или сокращенный. Для названия сокращений валют мы используем ISO
Код.