数字格式化选项 数字格式化的主要选项属性有: style "currency", "percent", or "decimal" (默认值). currency 3字母货币代码,如USD、CHF。需要style是"currency", 不然没有意义 currencyDisplay "code", "symbol", or "name", 默认为"symbol". "code"使用格式字符串的3字母货币代码。"symbol"使用货币符号,如$或£。"name"通常使用某些正式拼写版本的货币。(Firefox 目前仅支持"symbol", 这个问题不就就修复) minimumIntegerDigits 范围1到21(包含)的整数,默认为1。结果字符串的整数部分如果没有这么长,它前面会用0来填充。 (若这个值为2,那么3的格式化形式为“03”。) minimumFractionDigits, maximumFractionDigits 0-20(包含)的整数。结果字符串至少minimumFractionDigits, 至多maximumFractionDigits个有效数字。如果style是"currency",默认最小值跟货币有关(通常是2,很少0或者3),不然就是0。默认最大值,百分比是0,数字是3,货币的最大值跟货币有关。 minimumSignificantDigits, maximumSignificantDigits 1-21(包含)的整数。如果有,它们将会覆盖上文关于整数/分数的对数字的控制,而由它们以及数字的要求长度,共同确定格式化的数字字符串中最小/最大有效数字的值。 (注意对10的倍数,有效数字可能不准确,如100,它的1,2,3位有效数字。) useGrouping 布尔值(默认true)决定格式化字符串是否包含分组分隔符(如,英语的千分隔符“,”)。
NumberFormat还识别难懂的、大多数可忽略的localeMatcher属性。
区域化选项 在Unicode扩展中,使用nu关键字可以使DateTimeFormat支持自定义数字系统,NumberFormat也是这样。 例如,在中国,中文的语言标签是zh-CN。 汉语十进制数字系统对应的值是hanidec。 为了格式化这些系统的数字,我们在这些语言标签上添加一些Unicode扩展:zh-CN-u-nu-hanidec。 关于不同数字系统标识的完整信息,见NumberFormat详细说明文档。
示例 NumberFormat对象有一个 format方法,这一点和 DateTimeFormat相同。 format方法是一个有界函数,它有时可以独立于 NumberFormat使用。
下面是在当前Firefox环境下为特定用途创建NumberFormat选项的例子。首先,我们来格式化中国大陆中文的货币格式,特别是使用汉字数字(而不是更普遍的拉丁数字)。选择"currency" style, 然后使用renminbi(yuan)的货币代码,数字分组默认,小数部分数字采用通常做法。 1 2 3 4 | var tibetanRMBInChina =
new Intl.NumberFormat( "zh-CN-u-nu-hanidec" ,
{ style: "currency" , currency: "CNY" });
print(tibetanRMBInChina.format(1314.25));
|
或者我们来格式化美国的天然气价格,千分位有个古怪的9,用在美国英语中。 1 2 3 4 5 | var gasPrice =
new Intl.NumberFormat( "en-US" ,
{ style: "currency" , currency: "USD" ,
minimumFractionDigits: 3 });
print(gasPrice.format(5.259));
|
或者我们尝试埃及的阿拉伯语中的百分比。确定百分比有至少2个有效数字。(注意这个以及其他RTL例子可能在RTL上下文出现的顺序不一样,如٤٣٫٨٠٪ 而不是٤٣٫٨٠٪,RTL/right to left,从右到左的) 1 2 3 4 5 | var arabicPercent =
new Intl.NumberFormat( "ar-EG" ,
{ style: "percent" ,
minimumFractionDigits: 2 }).format;
print(arabicPercent(0.438));
|
或者假设我们格式化阿富汗波斯语,我们期望至少2位的整数部分,至多2位的小数部分。 1 2 3 4 5 | var persianDecimal =
new Intl.NumberFormat( "fa-AF" ,
{ minimumIntegerDigits: 2,
maximumFractionDigits: 2 });
print(persianDecimal.format(3.1416));
|
最后,我们格式化巴林的阿拉伯语中的巴林第纳尔的数量。不同于大部分货币,巴林第纳尔等于1000费尔,因此我们需要三位小数位。(再次注意,不要太过相信表面的阅读顺序)? 1 2 3 4 | 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”等。 1 2 3 4 5 6 7 | var names =
[ "Hochberg" , "Hönigswald" , "Holzman" ];
var germanPhonebook = new Intl.Collator( "de-DE-u-co-phonebk" );
print(names.sort(germanPhonebook.compare).join( ", " ));
|
有些德语单词使用变音符进行词形变化,所以在字典中排序会忽略变音符(除了两个单词仅仅变音符不同:schon,schön)。 1 2 3 4 5 | var germanDictionary = new Intl.Collator( "de-DE-u-co-dict" );
print(names.sort(germanDictionary.compare).join( ", " ));
|
或者我们来对美国英语的Firefox的版本进行排序,这些字符串故意打错(大小写不同,随机重音,变音标记,额外的连字符)。我们希望根据版本号进行排序,所以要做numeric排序,这样字符串中的数字才会作为数字参与比较,而不是逐字符的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 });
print(firefoxen.sort(usVersion.compare).join( ", " ));
|
最后,我们来做跟区域有关的字符串查找,查找忽略大小写和重音,并用于美国英语。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | var decoratedBrowsers =
[
"A\u0362maya" ,
"CH\u035Brôme" ,
"FirefÓx" ,
"sAfàri" ,
"o\u0323pERA" ,
"I\u0352E" ,
];
var fuzzySearch =
new Intl.Collator( "en-US" ,
{ usage: "search" , sensitivity: "base" });
function findBrowser(browser)
{
function cmp(other)
{
return fuzzySearch.compare(browser, other) === 0;
}
return cmp;
}
print(decoratedBrowsers.findIndex(findBrowser( "Firêfox" )));
print(decoratedBrowsers.findIndex(findBrowser( "Safåri" )));
print(decoratedBrowsers.findIndex(findBrowser( "Ãmaya" )));
print(decoratedBrowsers.findIndex(findBrowser( "Øpera" )));
print(decoratedBrowsers.findIndex(findBrowser( "Chromè" )));
print(decoratedBrowsers.findIndex(findBrowser( "IË" )));
|
|