Javascript 使用Number.toLocaleString()时货币格式的差异
我一直在研究javascript的区域设置感知数字格式,而Javascript 使用Number.toLocaleString()时货币格式的差异,javascript,unicode,localization,currency,icu,Javascript,Unicode,Localization,Currency,Icu,我一直在研究javascript的区域设置感知数字格式,而number.toLocaleString和by似乎是解决这个问题的好方法 特别是,我更喜欢在已经实现的抽象基础上构建特定于区域设置的格式,而不是重新发明轮子,为已经解决的问题提供更多的解决方案 因此,我在一些不同的javascript环境中调用了Number.toLocaleString,发现货币格式似乎发生了变化: (5).toLocaleString('fr-CH', {currency: 'CHF', style: 'curre
number.toLocaleString
和by似乎是解决这个问题的好方法
特别是,我更喜欢在已经实现的抽象基础上构建特定于区域设置的格式,而不是重新发明轮子,为已经解决的问题提供更多的解决方案
因此,我在一些不同的javascript环境中调用了
Number.toLocaleString
,发现货币格式似乎发生了变化:
(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与其他的不同,但考虑到它的年龄,我并不感到惊讶
- 令我惊讶的是
中fr CH
的格式似乎在节点版本CHF
和10
之间发生了变化12
- 为了进行比较,我查看了glibc LC_的货币设置,发现它似乎将
置于金额之前,至少在1997年左右。对于大多数当前浏览器,CHF
的位置似乎不同,这使得它特别令人困惑CHF
我想知道并理解:
CHF
的位置不同?
- 我知道这可能取决于可用的系统区域设置或浏览器。但是节点版本之间的变化似乎对我来说意味着一个更为近期和自愿的变化
CHF
,或者这两种选择是否都适用于CH,或者更具体地说fr CH
?
- 因此,拥有像论文或研究数据库这样的真实来源,而不是道听途说或轶事,将是一件美妙的事情
更新(2019-05-16): 针对我的部分建议,我想具体说明:
- 在commit中,
的格式决定为fr#u CH
,但我仍然缺少决定的来源,我很想知道它currencyFormat{“#,###0.00·;-#,###0.00·”}
Number.toLocaleString
的行为定义在哪里
- 在
中,我找到了builtins number.cc
,它使用BUILTIN(NumberPrototypeToLocaleString){…}
Intl::NumberToLocaleString(…)
- 这让我想到了
,它使用intl objects.cc
icu::number::LocalizedNumber格式化程序实现了
intl::NumberToLocaleString
- 我第一次试图找到数字格式的来源,这让我先查看了
和decimfmt
,但不知怎么的,我一直在失去跟踪numfmt
- 然后我意识到,将格式定义与代码的其余部分保持一定的分离可能是有意义的。通过查看网站和源代码,我终于找到了
和icu4c/source/data/locales/de_CH.txt
。icu4c/source/data/locales/fr_CH.txt
有de_CH.txt
currencyFormat{“·0.00;·0.00;·0.00”}
具有fr#u CH.txt
currencyFormat{“#,##0.00·;-#,##0.00·”}
- 现在使用
我找到了19个月前首次为git
()引入fr\u CH
的提交。currencyFormat
- 这可能介于节点
和v10
之间v12
- 我还可以看到,在
被添加到curreencyFormat
之前,回退到fr\u CH
是有意义的,因此可以看到格式将改变它的方式de\u CH
- 这可能介于节点
fr\u CH
的currencyFormat
的图表的位置
我觉得通过查找对fr\u CH
currencyFormat
的更改,我发现并理解了导致不同节点版本之间行为更改的更改
到目前为止,我不明白为什么glibc
和icu
在这里有差异,但这是我可以在具体项目的背景下询问的
我的印象是,我仍然缺少导致currencyFormat
实现的具体决策或数据点-如果我找到了,我会将其添加到这里并感到满意
更新2019-05-18:
- CLDR 32数据可以在下的下载部分找到。
- 我可以从中下载
,其中包括文件cldr-common-32.zip
,其中货币格式定义如下:common/main/fr_CH.xml
- 我可以从中下载
#,##0.00 ¤ ;-#,##0.00 ¤
- Via我还发现了一种调查工具,用于决定这些事项并记录这些决定的结果。
- 在中,我可以看到决策来源:
CHF
被放在数字之后而不是之前,commit对两张票证有了更好的认识。
这些票据是和,第二个票据是后续票据,用于清除某些格式
表面上,CLDR-9370似乎主要讨论十进制分隔符,但也讨论了货币符号的位置
其中一个来源是由