我一直在研究javascript和found的语言环境感知数字格式,let items = {
id: 1,
name: "name1",
currency: "usd"
}
Object.keys(items).forEach(function(key, index) {
console.log("key=>", key, ", index=>", index,", value=>", items[key]);
})
和extension Intl.NumberFormat似乎是解决此问题的好方法。
特别是,我宁愿在已实现的抽象之上构建特定于区域设置的格式,而不是重新发明轮子并为已经解决的问题提出另一种解决方案。
因此,我在某些不同的JavaScript环境中调用了Number.toLocaleString
,发现货币格式似乎已经改变:
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.'
中CHF
的格式似乎在节点版本fr-CH
和10
之间发生了变化。12
放置在至少约1997的位置之前。这尤其令人困惑。 CHF
对于大多数当前的浏览器似乎有所不同。我想了解和理解:
CHF
的位置为什么不同?
CHF
的正确方法,或者CH都可以接受两个选择,或更具体地说CHF
?
针对我的部分answer,我想指定:
fr-CH
的格式设置决定在提交3bfe134中以fr_CH
的形式给出,但是我仍然缺少该决定的来源,并且很想知道。答案 0 :(得分:3)
因此,我检查了v8 source,以查看是否可以定义Number.toLocaleString
的行为。
builtins-number.cc
中,我发现了BUILTIN(NumberPrototypeToLocaleString){…}
,它使用了Intl::NumberToLocaleString(…)
。intl-objects.cc
并使用Intl::NumberToLocaleString
实现icu::number::LocalizedNumberFormatter
。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
,我发现19个月前第一次为currencyFormat
(3bfe134)引入了fr_CH
的提交。
v10
和v12
之间。de_CH
添加到curreencyFormat
之前退回到fr_CH
是有意义的,因此,可以看到格式会改变它的方式。 / li>
该提交提到CLDR 32 alpha,我发现了CLDR charts version 32。
但是,我目前无法找出为currencyFormat
定义fr_CH
的图表所在的位置。
我觉得通过找到fr_CH
currencyFormat
的变化,我发现并理解了导致不同节点版本之间行为改变的变化。
到目前为止,我不明白为什么glibc
和icu
在这里有区别,但这是我可以在特定项目的背景下提出的。
我的印象是,我仍然缺少导致currencyFormat
实现的特定决策或数据点-如果找到它,我会在这里添加它并感到满意。
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>
出于好奇,我在libc-locales列表以及我可以在unicode-org票务系统上找到的closest ticket列表中都询问过这个问题。
这促使我进行进一步的研究,当与一个朋友进行研究时,我们偶然发现Github上的cldr repo专注于CLDR数据,而不是像icu那样具有CLDR相关数据。
我们发现,提交c5e7787引入了第一个更改,导致将CHF
置于数字之后而不是数字之前,并且提交使槽更好地了解了两张票。
这些票证分别为CLDR-9370和CLDR-10755,其中第二个票证是对后续工作进行了清理,以清除某些格式。
在表面上,CLDR-9370似乎主要讨论了十进制分隔符,同时还讨论了货币符号的放置。
给出的来源之一是欧洲核子研究组织(CERN)发布的typography guide (pdf),其中提供了有关写数字方式的详细说明。
使用google将其翻译为:
写钱
数字以三位数递增,并以 不间断的空间(没有点或撇号),并且是 在货币指示之后(且从未在其后)是 长或缩写。对于名称缩写货币,我们使用ISO 代码。