示例:国际化股票报价应用程序

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

全球股票报价应用程序在以下三个不同的股票市场上检索并显示虚构的股票相关数据:美国、日本和欧洲。它根据多种区域设置的约定设置数据格式。

此示例说明了 flash.globalization 包的下列功能:

  • 区域设置感知数字格式化

  • 区域设置感知货币格式化

  • 设置货币 ISO 代码和货币符号

  • 区域设置感知日期格式化

  • 检索并显示相应的月份名称缩写

若要获取此范例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn 。可以在 Samples/GlobalStockTicker 文件夹中找到全球股票报价应用程序文件。该应用程序包含以下文件:

文件

说明

GlobalStockTicker.mxml

GlobalStockTicker.fla

适用于 Flex (MXML) 或 Flash (FLA) 的应用程序的用户界面。

styles.css

应用程序用户界面的样式(仅限 Flex)。

com/example/programmingas3/stockticker/flex/FinGraph.mxml

显示模拟股票数据图表的 MXML 组件,仅限 Flex。

com/example/programmingas3/stockticker/flash/GlobalStockTicker.as

包含应用程序的用户界面逻辑的 Document 类(仅限 Flash)。

comp/example/programmingas3/stockticker/flash/RightAlignedColumn.as

Flash DataGrid 组件的自定义单元格渲染器(仅限 Flash)。

com/example/programmingas3/stockticker/FinancialGraph.as

用于绘制模拟股票数据图表的 ActionScript 类。

com/example/programmingas3/stockticker/Localizer.as

ActionScript 类,用于管理区域设置和货币并处理本地化的数字、货币金额和日期的格式化。

com/example/programmingas3/stockticker/StockDataModel.as

ActionScript 类,用于包含全球股票报价示例的所有采样数据。

了解用户界面和采样数据

应用程序的主要用户界面元素是:

  • 用于选择区域设置的组合框

  • 用于选择市场的组合框

  • 用于显示每个市场中六家公司的数据的 DataGrid

  • 用于显示所选公司股票的模拟历史数据的图表

应用程序将存储 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 属性设置为先前确定的值。(用户每次从市场组合框中选择新市场时,都会设置这些值)。

创建 DateTimeFormatter 对象后,setLocale() 方法还会检索本地化的月份名称缩写的数组。

格式化数据

格式化的股票数据显示在 DataGrid 控件中。每个 DataGrid 列将调用使用适当的格式化程序对象设置列值格式的标签函数。

例如,在 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。它还为每列定义类似的标签函数。

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); 
} 
|