Flash Player中的flash.globalization包(part6):格式化货币金额

货币金额的特点是包含一个货币代码或符号。CurrencyFormatter类与NumberFormatter相似,但提供了额外的方法和属性来处理货币。

文化敏感的货币格式

相对于普通的数值,货币数值的书面表示在不同文化之间差别很大,特别是在货币符号的位置方面。
例如,考虑值123456又四分之一,表示以元(dollars)为单位的一个数量。如图2所示,观察货币符号是怎样被放在其他数的前面或后面的,并且可能使用或不使用一个空格将数和符合隔开。

图2:货币金额示例

即使在一个社群(community)内部,货币格式也可能不同于普通的数字格式。例如,在美国,负值123456又四分之一将显示为-123,456.25,如果它是一个普通的数字值(并因此使用NumberFormatter类进行格式化),但其等值的货币将使用CurrencyFormatter类格式化为($123,456.25),使用括号而不是一个负号。

中立依然良好

正如像对待普通数值一样,对于和用户直接的交互要小心使用文化敏感的货币格式化器。如果您需要持久地存储货币金额(存储在数据库或文件中),那么使用该值的二进制形式或文化中立的文本表示形式(例如像Number类的toString()方法产生的那样)来保证:它可以被任何平台上的任何应用程序可靠地进行解码。按一下形式存储货币的标识(identification):一个无二义性的并且普遍公认的ISO 4217编码(例如,“USD”),而不要使用一个像“$”这样的符号。

使用CurrencyFormatter类

使用区域标识符创建一个CurrencyFormatter类的实例,就像您用NumberFormatter类一样。

var moneyFormatter:CurrencyFormatter = new CurrencyFormatter(selectedLocale);

如使用NumberFormatter类那样,一个备用的区域可能被选中。更多相关信息请参考关于NumberFormatter的讨论或者是“Selecting a locale”一节。

有了货币格式化器,您可能急于进行格式化您的第一个值。但是还缺少的一些东西:您在使用何种货币?

选择货币

默认货币被关联到了每个区域。实际上,这是无关紧要的。分组或小数分隔符可能是一个非实质性的约定(cosmetic conventions),但货币符号代表一个具体的单位,不能随意变更。如果您是在Sidney的,那么您可能会要求所有的客户使用澳元支付您。即使如果您决定通过允许欧元付款来接纳欧洲客户,那么您首先需要在交易时采用有效的汇率转换所有金额;只有这样,您才能显示最终的金额。

即使您确信与请求的区域关联相关联的默认货币是理想中的那个,但不请不要依赖这一假设!首先,默认货币可能会因操作系统而有所不同。它也可能随时间变化(例如,一个国家可能会加入 Eurozone(欧元区) )。一些国家通常使用一种以上的货币。最后,如果您的要求的区域在运行时没有被发现,那么一个备用的区域将会被使用,而且很可能有一个不同的默认货币。您的会计师可能无法会对结果不满意。

严格控制由货币格式化器显示的货币符号(或代码),这样的做法是有道理的。幸运的是,有一个简单的方法这样做:实例格式化器之后立即使用方法setCurrency()将货币设置成想要的样子,传递两个参数:一个ISO 4217货币代码(例如,USD表示美国美元(United States dollars))和一个符号表示(symbolic representation )(例如,$)。

现在您可以安全地使用格式化器了:

  1. var moneyFormatter:CurrencyFormatter = new CurrencyFormatter(selectedLocale);
  2. moneyFormatter.setCurrency("USD", "$");
  3. var valueText:String = moneyFormatter.format(123456.25);

默认情况下,货币格式化器将使用货币的ISO 4217代码。这提供了两个好处:第一,ISO 4217代码是国际公认的,不需要进行本地化;第二,不同与货币符号(可以代表一个以上的货币),ISO代码是无二义性的。想想,例如,美元符号。有几个主权国家的货币使用相同的货币符号$(无论他们是否称之为“元(dollar)”)。在美国,它表示美元;在澳大利亚,它表示澳元。为避免混淆,符号必须有效地进行区域化:对一个澳大利亚用户,美元被显示为US$,而对美国的用户只显示$;对澳大利亚用户,澳元只显示$,但对美国用户为AU$。

一旦您相信您为所需的货币获得了正确的符号(充分地为当前用户区域化),那只需将值true作为第二个参数传递给方法format(),这样货币符号将被用来代替ISO代码而使用:
var valueWithSymbol:String =  moneyFormatter.format(123456.25, true);

自定义货币格式化器

像普通的NumberFormatter,CurrencyFormatter类使您可以读取关键的设置,并且在需要的时候更改它们。关于NumberFormatter的意见和警告也适用于此。

解码由用户输入的货币值

如果用户键入一个货币值,那么您可能需要将它变成一个真正的Number,这样您就可以使用它进行一些计算了(例如,比较应付款金额与一个账户的余额)。使用CurrencyFormatter类的parse()方法将可以使您安全地这样做:

  1. import flash.globalization;
  2. var moneyFormatter:CurrencyFormatter = new CurrencyFormatter("hi-IN");
  3. if(moneyFormatter.lastOperationStatus != LastOperationStatus.NO_ERROR) {
  4. //这里需要一些错误处理...
  5. trace("Could not use the requested locale!"); }
  6. var parseResult:CurrencyParseResult = moneyFormatter.parse("-रु. १,२३,४५६.२५");
  7. if(moneyFormatter.lastOperationStatus != LastOperationStatus.NO_ERROR) {
  8. //这里需要一些错误处理... trace("Could not parse the monetary value!");
  9. }

如果操作系统支持区域hi-IN(印度说北印度语(Hindi)的人),上面的例子应存储负值-123456.25(十二万三千四百五十六又四分之一 )在parseResult.value中,而parseResult.currencyString将收到的货币符号“रु.”(印度卢比(Indian rupee))。

当使用货币解析器时,您需要小心:开头和结尾的空白将被去除;文本包含任何数字和格式化器预期的分隔符之外的字符都将被解释成货币符号(如果其位置匹配货币模式),并将导致特殊值NaN(not a number(不是一个数字))被存储。例如,一个起始的加号(+)会导致parse()方法产生NaN。

解释货币符号可能是困难的,因为,即使对一个社群(community)内的用户而言,有超过一个表示方法可能是常用的。例如,卢比可以下列形式被键入:Rs, , रु.或其他符号。相反,一个符号可能被含糊地用于一种以上的货币:如果一个印度尼西亚(Indonesian)用户键入美元符号$,那他是否认为是澳元、美元,还是其他什么呢?如果有可能,使您的用户从一个列表中选择货币(例如,通过一个UI控件下拉列表),并且只将值作为一个普通的数输入。或者,对于处理许多国际货币的应用程序,考虑使用ISO 4217代码,它可以可靠地被分析和识别。

上一页(Par5) / 下一页(Par7)

riadevID: 
您给予的分值: None

发表新评论

  • 网页地址和电子邮件地址将会被自动转换为链接。
  • 行和段被自动切分。
  • 您可以使用下面的标签来高亮显示您的评论内容: <code>, <blockcode>. 可以使用"[foo]".旁边显示标签样式 "<foo>" PHP代码可以用这样的区块来包含<?php ... ?> or <% ... %>

更多格式化选项信息

验证区域
系统验证:请回答下面的问题