Flash Player中的flash.globalization包(part5):普通数字格式

跟踪数量的需求可能开始于书写本身的起源,有许多方法来表示数值。以每个用户熟悉的表现形式显示可以增加舒适度,并可以避免代价高昂的误解。

文化敏感的数字格式

全世界大多数人现在都使用某种positional十进位制的变体:每个数(number)由一串数字(digits)表示,每个数字的所在的位置代表其权重。一个小数分隔符被置于数的整数和小数部分之间。在非常大的数中,其他的分隔符被置于将数字分组,来提高易读性。一个特殊的符号或约定(convention)来表明一个数字是正还是负。所有这些因素都因传统和文化的不同而不同。

例如,考虑123456和四分之一(123456 and one quarter的值。图1显示了它应如何向不同的用户呈现。注意小数分隔符和分组分隔符有何不同。在印度语中,分组分隔符本身不仅是与众不同的,而且是可变的:每两个数字,但从低三位开始。最后,注意在Hindi中的Devanagari数字的使用。

图1数字格式示例

从上面的例子中,您可以看到文本1.125会被美国读者理解为一又八分之一 ,但德国读者的理解却是这的1000倍。使用文化感知(culturally aware)可以帮助您避免高代价的失误!

中立也可以是一件好事

当存储持久性数据(例如,在数据库或文件中)或与其他进程交互数据时,互操作性和可靠性是最重要的。在这些时候,您应该把数(numbers)以二进制形式(如int、uint或Number)或以一个普通的(与文化无关的)文本形式存储,如由toString()方法产生的文本格式。这确保任何应用程序,无论在什么平台上运行,都将能够读取数据而不会出现错误。当您需要向用户显示一个数值时,另一方面,使用来自flash.globalization包的NumberFormatter类,以确保您的用户将正确地阅读和理解该值。

使用NumberFormatter类

在这一点上,您应该已经确定了您的用户的首选区域并将之保存在一个String里。现在,您可以简单地创建一个NumberFormatter实例,并使用它的其中一个format方法,例如,使用formatNumber()来格式化一个存储在Number类型对象的浮点值:

  1. var numberFormatter:NumberFormatter = new NumberFormatter(selectedLocale);
  2. var value1Text:String = numberFormatter.formatNumber(123456.125);
  3. var value2Text:String = numberFormatter.formatInt(123456);

请记住,如果平台不完全支持您所指定的区域,Flash Player可能无法创建您要求的确切的格式化器。在这种情况下,它将替代备用区域。您可以在创建了一个对象之后,通过检查NumberFormatter类的lastOperationStatus属性立即发现这种情况是否发生。如果它显示的不是LastOperationStatus.NO_ERROR,那么检查actualLocaleIDName属性的值,以便找出作为后备(fallback))使用的区域。后备(Fallback)在“ Selecting a locale(选择一个区域) ”一节有详细介绍。

自定义数字格式化器

NumberFormatter类提供了一些属性,这些属性让您检查一个给定格式化器使用了什么样的约定(conventions)。例如,使用decimalSeparator属性来看放在小数部分之前的符号。您也可以更改这些属性的值,从而影响格式化器的行为。

例如,在特殊情况下,您可能想不使用数字分组分隔符来显示数(numbers)。useGrouping属性 ,允许您进行这样的控制:

  1. var numberFormatter:NumberFormatter = new NumberFormatter("ru‑RU");
  2. var withGrouping:String = numberFormatter.formatNumber(123456.25);
  3. numberFormatter.useGrouping = false;
  4. var withoutGrouping:String = numberFormatter.formatNumber(123456.25);

现在变量withGrouping包含了123 456,25(一个非中断空格(non-breaking space)被用作了分组分隔符),而变量withoutGrouping现在包含123456,25。
其它属性让您更精细地控制输出。fractionalDigits属性指定小数部分的最大长度。然而,要知道,四舍五入要依赖于操作系统。

设置digitsType属性,如果您想要使用一组不同的数(numerals)(比如印度数(Indian numerals)),使用常量NationalDigitsType.DEVANAGARI指定)的话。但是再一次,要知道,操作系统对替代的数(alternate numerals)的支持不是一致的(检查lastOperationStatus属性)。

此外,请记住,NumberFormatter类的一个主要优点是自动为您指定的区域选择正确的格式;对格式的干扰可能会产生的令您的用户困惑的结果。

解码由用户输入的数值

如果用户键入一个数值,您可能将需要将它转变成一个真正的Number,这样您可以用它执行了其他的计算。NumberFormatter的parse()和parseNumber()方法将让您安全地这样做,根据他们的区域识别用户的习惯(conventions):

  1. import flash.globalization;
  2. var numberFormatter:NumberFormatter = new NumberFormatter("ar-SA");
  3. if(numberFormatter.lastOperationStatus != LastOperationStatus.NO_ERROR)
  4. { //这里需要一些错误处理...
  5. trace("Could not use the requested locale!"); }
  6.  
  7. var value:Number = numberFormatter.parseNumber("١٢٣٤٥٦٫٢٥-");
  8. if(numberFormatter.lastOperationStatus != LastOperationStatus.NO_ERROR)
  9. { //这里需要一些错误处理...
  10. trace("Could not parse the numeric value!");
  11. }

如果操作系统支持区域ar-SA(在沙特阿拉伯的说阿拉伯语的人),那么上面的例子应该存储负值-123456.25(负的十二万三千四百五十六又四分之一 )。请注意,在沙特阿拉伯,负号是放在后面的。

解析器可以识别所支持的任何数(numerals),所以您不必担心设置digitsType属性来匹配用户的输入。
当使用parseNumber()方法时,您需要小心:开头和结尾的空白将被忽略,但如果输入的文本包含格式化器期望的数字和分隔符之外的其他任何东西,那么就会返回一个特殊值NaN(not a number,不是一个数)。例如,一个起始的加号(+)将会触发这种一个错误。

如果您输入的文本中包含的不仅仅是一个数,您可以用parse()方法代替。这种方法将在第一个意外的字符处停止,而不是一个Number,返回一个NumberParseResult类的实例,包含:至此所解码的值(而不是NaN)、数的第一个字符索引(index)和分析停止处字符的索引。这使得您的应用程序,比方说,可以遍历文本来解码成几个数。

上一页(Par4) / 下一页(Par6)

riadevID: 
您给予的分值: None

发表新评论

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

更多格式化选项信息

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