最后,我们格式化巴林的阿拉伯语中的巴林第纳尔的数量。不同于大部分货币,巴林第纳尔等于1000费尔,因此我们需要三位小数位。(再次注意,不要太过相信表面的阅读顺序)?
var bahrainiDinars = new Intl.NumberFormat("ar-BH", { style: "currency", currency: "BHD" }); print(bahrainiDinars.format(3.17)); // ?.?.? ?????
整理
选项
下面是整理的主要选项属性:
usage
"sort" or "search" (默认"sort"), 指定整理器(collator)的目的。(查找整理器可能比排序整理器更多考虑字符串是否相等。)
sensitivity/敏感性
"base", "accent", "case", or "variant"。这个选项影响整理器对基本字符相同但是重音/变音不同的字符的敏感性。(基本字符与区域设置有关:“a”和“?”在德语中基本字符相同,但是瑞典语中是不同的。) "base"敏感性只考虑基本字符,忽略各种变体(如德语中“a”, “A”,和“?”被认为是相同的)。 "accent"敏感性考虑基本字符和重音,但是忽略大小写(如德语中的“a和“A”是相同的,“?”与两者不同)。"case"考虑基本字符和大小写,而忽略重音(如德语中的“a”和“?”相同,而与“A”不同)。"variant"考虑基本字符、重音、大小写(如德语的“a”, “?”和“A”均不同)。如果usage是"sort",默认"variant"; 否则与区域设置有关。
numeric
默认false的布尔值,决定字符串中的数字是否被当做数字参与比较。如当做数字的排序结果可能是"F-4 Phantom II", "F-14 Tomcat", "F-35 Lightning II"; 不当做数字的结果"F-14 Tomcat", "F-35 Lightning II", "F-4 Phantom II".
caseFirst
"upper", "lower", or "false" (默认)。决定比较时是否考虑大小写:"upper"把大写放在前面("B", "a", "c"), "lower"把小写放前面("a", "c", "B"), "false"完全忽略大小写("a", "B", "c")。 (注意,目前Firefox完全忽略这个属性)
ignorePunctuation
默认false的布尔值。决定比较时是否忽略标点(如"biweekly"和"bi-weekly"是否相等)。
localeMatcher属性你可以忽略了。
区域相关选项
区域的Unicode扩展部分指定的整理器主要选项是co,它选择排序操作的方式:电话本(phonebk), 字典 (dict), 还有其他。
另外,kn和kf这两个key可以选择拷贝选项对象的numeric和caseFirst属性。但是并不保证可用于语言标签,而且选项比语言标签的组件更清晰。所以最好在选项内部进行调整。
key-value对(paris)嵌入到Unicode的方式跟DateTimeFormat和NumberFormat相同; 想知道如何在语言标签中指定它们,可以查看对应的章节。
举例
整理器Collator对象有个比较函数属性。这个函数接受2个参数x和y, 如果x<y返回负值,x>y返回正值,x==y返回0。对于格式化函数,比较是个有界函数(bound function),可以抽取出来做其他用途。
我们尝试来给德国德语的姓氏进行排序。德语中实际上有2种排序方式,电话本和字典。电话本排序强调读音,比如“?”, “?”等近似被扩展成“ae”, “oe”等。
var names = ["Hochberg", "H?nigswald", "Holzman"]; var germanPhonebook = new Intl.Collator("de-DE-u-co-phonebk"); //就像对["Hochberg", "Hoenigswald", "Holzman"]排序 // Hochberg, H?nigswald, Holzman print(names.sort(germanPhonebook.compare).join(", "));
有些德语单词使用变音符进行词形变化,所以在字典中排序会忽略变音符(除了两个单词仅仅变音符不同:schon,sch?n)。
var germanDictionary = new Intl.Collator("de-DE-u-co-dict"); //就像对["Hochberg", "Hoenigswald", "Holzman"]排序 // Hochberg, H?nigswald, Holzman print(names.sort(germanDictionary.compare).join(", "));
或者我们来对美国英语的Firefox的版本进行排序,这些字符串故意打错(大小写不同,随机重音,变音标记,额外的连字符)。我们希望根据版本号进行排序,所以要做numeric排序,这样字符串中的数字才会作为数字参与比较,而不是逐字符的。
var firefoxen = ["FireF?x 3.6", "Fire-fox 1.0", "Firefox 29", "Fírefox 3.5", "Fírefox 18"]; var usVersion = new Intl.Collator("en-US", { sensitivity: "base", numeric: true, ignorePunctuation: true }); // Fire-fox 1.0, Fírefox 3.5, FireF?x 3.6, Fírefox 18, Firefox 29 print(firefoxen.sort(usVersion.compare).join(", "));
最后,我们来做跟区域有关的字符串查找,查找忽略大小写和重音,并用于美国英语。