设置数字格式

Flash Player 10.1 和更高版本,Adobe AIR 2.0 和更高版本

根据区域的不同,数值的显示格式也大不相同。例如,以下是针对特定区域设置对数字 123456.78 进行格式设置的方式:

区域设置

数字格式

en-US(英语,美国)

-123,456.78

de-DE(德语,德国)

-123.456,78

fr-FR(法语,法国)

-123 456,78

de-CH(德语,瑞士)

-123'456.78

en-IN(英语,印度)

-1,23,456.78

许多阿拉伯区域设置

123,456.78-

影响数字格式的因素有许多,包括:

  • 分隔符。小数点分隔符置于数字的整数和小数部分之间。它可以是句号、逗号或其他字符。分组分隔符或千位分隔符可以是句号、逗号、不间断空格或其他字符。

  • 分组模式。小数点左侧的每个分组分隔符之间的数位可以是两位或三位,或者其他值。

  • 负数指示符。负数可以显示为数字左侧或右侧带有一个减号,或者用括号表示(对于财务应用程序)。例如,负 19 可以显示为 -19、19- 或 (19)。

  • 前导零和尾部零。某些文化约定对显示的数字添加前导零或尾部零。例如,值 0.17 可能显示为 .17、0.17 或 0.170 等。

  • 数字字符集。许多语言,包括印地语、阿拉伯语和日语,使用不同的数字字符集。flash.globalization 包支持任何映射到数字 0-9 的数字字符集。

格式化数值时,NumberFormatter 类将考虑所有这些因素。

使用 NumberFormatter 类

NumberFormatter 类将根据特定区域设置的约定格式化数值(类型为 int、uint 或 Number)。

以下示例显示了使用用户的操作系统提供的默认格式设置属性格式化数字的最简单方式:

var nf:NumberFormatter = new NumberFormatter(LocaleID.DEFAULT); 
trace(nf.formatNumber(-123456.789))

结果根据用户的区域设置设置和用户首选项而变化。例如,如果用户的区域设置是 fr-FR,则格式化的值将是:

-123.456,789

如果您只希望格式化特定区域设置的数字,而不管用户的设置如何,则专门设置区域设置名称。例如:

var nf:NumberFormatter = new NumberFormatter("de-CH"); 
trace(nf.formatNumber(-123456.789));

在这种情况下,结果为:

-123'456.789

formatNumber() 方法将采用 Number 作为参数。NumberFormatter 类还具有采用 int 作为输入的 formatInt() 方法,以及采用 uint 的 formatUint() 方法。

您可以通过设置 NumberFormatter 类的属性明确控制格式化逻辑,如此示例中所示:

var nf:NumberFormatter = new NumberFormatter("de-CH"); 
nf.negativeNumberFormat = 0; 
nf.fractionalDigits = 5; 
nf.trailingZeros = true; 
nf.decimalSeparator = ","; 
nf.useGrouping = false; 
trace(nf.formatNumber(-123456.789)); //(123456.78900) 

此示例首先创建一个 NumberFormatter 对象,然后:

  • 将负数格式设置为使用括号(与财务应用程序相同);

  • 将小数点分隔符之后的数位设置为 5;

  • 指定使用尾部零以确保 5 位小数;

  • 将小数点分隔符设置为逗号;

  • 要求格式化程序不使用任何分组分隔符。

注: 当更改其中一些属性时,生成的数字格式将不再对应于指定区域设置的首选格式。仅在下列情况下使用其中一些属性:当区域设置感知不重要时;当您需要详细控制格式的一个方面(例如尾部零的数量)时;或者当用户直接请求更改(例如,通过 Windows 控制面板进行更改)时。

分析包含数值的字符串

NumberFormatter 类还可以从符合区域设置特定格式化要求的字符串提取数值。NumberFormatter.parseNumber() 方法从字符串提取单个数值。例如:

var nf:NumberFormatter = new NumberFormatter( "en-US" ); 
var inputNumberString:String =  "-1,234,567.890" 
var parsedNumber:Number = nf.parseNumber(inputNumberString); 
trace("Value:" + parsedNumber); // -1234567.89 
trace("Status:" + nf.lastOperationStatus); // noError

parseNumber() 方法处理仅包含位数和数字格式化字符(例如负号和分隔符)的字符串。如果字符串包含其他字符,则设置错误代码:

var nf:NumberFormatter = new NumberFormatter( "en-US" ); 
var inputNumberString:String =  "The value is 1,234,567.890" 
var parsedNumber:Number = nf.parseNumber(inputNumberString); 
trace("Value:" + parsedNumber); // NaN 
trace("Status:" + nf.lastOperationStatus); // parseError

要从包含其他字母字符的字符串中提取数字,请使用 NumberFormatter.parse() 方法:

var nf:NumberFormatter = new NumberFormatter( "en-US" ); 
var inputNumberString:String = "The value is 123,456,7.890"; 
var parseResult:NumberParseResult = nf.parse(inputNumberString); 
trace("Value:" + parseResult.value); // 1234567.89 
trace("startIndex: " + parseResult.startIndex); // 14 
trace("Status:" + nf.lastOperationStatus); // noError

parse() 方法返回在其值属性中包含分析的数值的 NumberParseResult 对象。startIndex 属性指示找到的第一个数字字符的索引。您可以使用 startIndex 和 endIndex 属性提取字符串中数位之前和之后的部分。