JavaScript面对国际化编程时的一些建议(3)

对一些完全不同的、更长的date,用于泰国泰语,但是使用泰语数字系统和中国历法。(类似Firefox的高质量实现通常会将普通的th-TH当做th-TH-u-ca-buddhist-nu-latn, 因为泰国使用佛历系统和拉丁0-9数字)。
 

var options = { year: "numeric", month: "long", day: "numeric" }; var thaiDate = new Intl.DateTimeFormat("th-TH-u-nu-thai-ca-chinese", options); print(thaiDate.format(july172014)); // ?? 6 ??

撇开历法和数字系统,还是很简单的。只要选取自己的组件和长度。
 
选项

数字格式化的主要选项属性有:

    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对象有一个 format方法,这一点和 DateTimeFormat相同。 format方法是一个有界函数,它有时可以独立于 NumberFormat使用。


下面是在当前Firefox环境下为特定用途创建NumberFormat选项的例子。首先,我们来格式化中国大陆中文的货币格式,特别是使用汉字数字(而不是更普遍的拉丁数字)。选择"currency" style, 然后使用renminbi(yuan)的货币代码,数字分组默认,小数部分数字采用通常做法。
 

var tibetanRMBInChina = new Intl.NumberFormat("zh-CN-u-nu-hanidec", { style: "currency", currency: "CNY" }); print(tibetanRMBInChina.format(1314.25)); // ¥ 一,三一四.二五

或者我们来格式化美国的天然气价格,千分位有个古怪的9,用在美国英语中。
 

var gasPrice = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", minimumFractionDigits: 3 }); print(gasPrice.format(5.259)); // $5.259

或者我们尝试埃及的阿拉伯语中的百分比。确定百分比有至少2个有效数字。(注意这个以及其他RTL例子可能在RTL上下文出现的顺序不一样,如?????? 而不是??????,RTL/right to left,从右到左的)
 

var arabicPercent = new Intl.NumberFormat("ar-EG", { style: "percent", minimumFractionDigits: 2 }).format; print(arabicPercent(0.438)); // ??????

或者假设我们格式化阿富汗波斯语,我们期望至少2位的整数部分,至多2位的小数部分。
 

var persianDecimal = new Intl.NumberFormat("fa-AF", { minimumIntegerDigits: 2, maximumFractionDigits: 2 }); print(persianDecimal.format(3.1416)); // ?????

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgdjsd.html