範例:國際化股票行情應用程式Flash Player 10.1 以及更新的版本,Adobe AIR 2.0 以及更新的版本 Global Stock Ticker 應用程式擷取和顯示三個不同股票市場 (美國、日本和歐洲) 的虛構股票資料。其中會依據各個地區設定的慣例,將資料格式化。 這個範例說明 flash.globalization 套件的下列功能:
若要取得此樣本的應用程式檔案,請參閱 www.adobe.com/go/learn_programmingAS3samples_flash_tw。您可以在 Samples/GlobalStockTicker 資料夾中找到 Global Stock Ticker 應用程式檔案。此應用程式是由下列檔案組成:
瞭解使用者介面和範例資料應用程式的主要使用者介面元素如下:
這個應用程式會將它的所有地區設定、市場和公司股票範例資料儲存至 StockDataModel 類別。實際的應用程式會從伺服器擷取資料,然後將它儲存至 StockDataModel 之類的類別。在這個範例中,所有資料都是硬式編碼至 StockDataModel 類別。 備註: 財務圖表中顯示的資料不一定符合 DataGrid 控制項中顯示的資料。每次選取不同的公司時,就會隨機重新繪製此圖表。這僅供說明之用。
設定地區設定在部分初始設定工作之後,應用程式會呼叫 Localizer.setLocale() 方法以建立預設地區設定的格式化程式物件。每次使用者從「地區設定」下拉式清單方塊中選取新值時,也會呼叫 setLocale() 方法。 public function setLocale(newLocale:String):void { locale = new LocaleID(newLocale); nf = new NumberFormatter(locale.name); traceError(nf.lastOperationStatus, "NumberFormatter", nf.actualLocaleIDName); cf = new CurrencyFormatter(locale.name); traceError(cf.lastOperationStatus, "CurrencyFormatter", cf.actualLocaleIDName); symbolIsSafe = cf.formattingWithCurrencySymbolIsSafe(currentCurrency); cf.setCurrency(currentCurrency, currentSymbol); cf.fractionalDigits = currentFraction; df = new DateTimeFormatter(locale.name, DateTimeStyle.LONG, DateTimeStyle.SHORT); traceError(df.lastOperationStatus, "DateTimeFormatter", df.actualLocaleIDName); monthNames = df.getMonthNames(DateTimeNameStyle.LONG_ABBREVIATION); } public function traceError(status:String, serviceName:String, localeID:String) :void { if(status != LastOperationStatus.NO_ERROR) { if(status == LastOperationStatus.USING_FALLBACK_WARNING) { trace("Warning - Fallback locale ID used by " + serviceName + ": " + localeID); } else if (status == LastOperationStatus.UNSUPPORTED_ERROR) { trace("Error in " + serviceName + ": " + status); //abort application throw(new Error("Fatal error", 0)); } else { trace("Error in " + serviceName + ": " + status); } } else { trace(serviceName + " created for locale ID: " + localeID); } } setLocale() 方法會先建立 LocaleID 物件。這個物件可簡化稍後取得實際地區設定之詳細資料的作業 (必要時)。 接下來,它會為地區設定建立新的 NumberFormatter、CurrencyFormatter 和 DateTimeFormatter 物件。它會在建立每個格式化程式物件之後呼叫 traceError() 方法。如果要求的地區設定發生問題,則這個方法會在主控台中顯示錯誤和警告訊息 (實際應用程式應該根據這類錯誤採取動作,而不只是追蹤它們)。 建立 CurrencyFormatter 物件之後,setLocale() 方法會將格式化程式的貨幣 ISO 代碼、貨幣符號和 fractionalDigits 屬性設為先前判定的值 (每次使用者從 Markets 下拉式清單方塊中選取新市場時,都會設定那些值)。 建立 DateTimeFormatter 物件之後,setLocale() 方法也會擷取當地語系化月份名稱縮寫的陣列。 格式化資料格式化的股票資料是以 DataGrid 控制項呈現。DataGrid 欄都會呼叫 label 函數,以使用適當的格式化程式物件來格式化欄值。 例如,在 Flash 版本中,下列程式碼會設定 DataGrid 欄: var col1:DataGridColumn = new DataGridColumn("ticker"); col1.headerText = "Company"; col1.sortOptions = Array.NUMERIC; col1.width = 200; var col2:DataGridColumn = new DataGridColumn("volume"); col2.headerText = "Volume"; col2.width = 120; col2.cellRenderer = RightAlignedCell; col2.labelFunction = displayVolume; var col3:DataGridColumn = new DataGridColumn("price"); col3.headerText = "Price"; col3.width = 70; col3.cellRenderer = RightAlignedCell; col3.labelFunction = displayPrice; var col4:DataGridColumn = new DataGridColumn("change"); col4.headerText = "Change"; col4.width = 120; col4.cellRenderer = RightAlignedCell; col4.labelFunction = displayPercent; 這個範例的 Flex 版本會以 MXML 宣告它的 DataGrid,也會為每欄定義類似的 label 函數。 labelFunction 屬性會參照下列函數,而它們會呼叫 Localizer 類別的格式方法: private function displayVolume(item:Object):String { return localizer.formatNumber(item.volume, 0); } private function displayPercent(item:Object):String { return localizer.formatPercent(item.change ) ; } private function displayPrice(item:Object):String { return localizer.formatCurrency(item.price); } 而 Localizer 方法接著會設定並呼叫適當的格式化程式: public function formatNumber(value:Number, fractionalDigits:int = 2):String { nf.fractionalDigits = fractionalDigits; return nf.formatNumber(value); } public function formatPercent(value:Number, fractionalDigits:int = 2):String { // HACK WARNING: The position of the percent sign, and whether a space belongs // between it and the number, are locale-sensitive decisions. For example, // in Turkish the positive format is %12 and the negative format is -%12. // Like most operating systems, flash.globalization classes do not currently // provide an API for percentage formatting. nf.fractionalDigits = fractionalDigits; return nf.formatNumber(value) + "%"; } public function formatCurrency(value:Number):String { return cf.format(value, symbolIsSafe); } public function formatDate(dateValue:Date):String { return df.format(dateValue); } | |
|