格式化數字

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;

  • 指定使用結尾零,確保具有五位數;

  • 將小數分隔符號設為逗點;

  • 告訴格式化程式不要使用任何分組分隔符號。

備註: 上述部分屬性變更時,產生的數字格式就不再對應所指定地區設定的偏好格式。上述部分屬性只適用於不一定要區分地區設定時、需要更詳細控制格式的單一部分 (例如結尾零的數目) 時,或是使用者直接要求變更時 (例如,透過 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 屬性,擷取位數前後的字串部分。