Voorbeeld: een toepassing voor het volgen van aandelenkoersen internationaliseren

Flash Player 10.1 of hoger, Adobe AIR 2.0 of hoger

De toepassing Global Stock Ticker haalt fictieve gegevens over aandelen op in drie verschillende aandelenmarkten: de Verenigde Staten, Japan en Europa. Vervolgens worden de gegevens weergegeven. De gegevens krijgen een notatie die overeenkomt met de conventies van de verschillende landinstellingen.

In dit voorbeeld wordt aandacht besteed aan de volgende functies van het flash.globalization-pakket:

  • Getalnotatie op basis van landinstellingen

  • Valutanotatie op basis van landinstellingen

  • Instellen van ISO-valutacode en valutasymbolen

  • Datumnotatie op basis van landinstellingen

  • Ophalen en weergeven van correcte afkortingen voor de namen van de maanden

Zie www.adobe.com/go/learn_programmingAS3samples_flash_nl als u de toepassingsbestanden voor dit voorbeeld wilt downloaden. De toepassingsbestanden van Global Stock Ticker staan in de map Samples/GlobalStockTicker. De toepassing bestaat uit de volgende bestanden:

Bestand

Beschrijving

GlobalStockTicker.mxml

of

GlobalStockTicker.fla

De gebruikersinterface voor de toepassing voor Flex (MXML) of Flash (FLA).

styles.css

Stijlen voor de gebruikersinterface van de toepassing (alleen Flex).

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

Een MXML-component waarmee een grafiek met gesimuleerde aandelengegevens wordt weergegeven, alleen voor Flex.

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

Een Document-klasse met de logica voor de gebruikersinterface voor de toepassing (alleen Flash).

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

Een weergavefunctie voor aangepaste cellen voor de Flash DataGrid-component (alleen Flash).

com/example/programmingas3/stockticker/FinancialGraph.as

Een ActionScript-klasse waarmee een grafiek met gesimuleerde aandelengegevens kan worden getekend.

com/example/programmingas3/stockticker/Localizer.as

Een ActionScript-klasse waarmee de landinstellingen en de valuta worden beheerd en waarmee de gelokaliseerde getal-, valuta- en datumnotaties worden afgehandeld.

com/example/programmingas3/stockticker/StockDataModel.as

Een ActionScript-klasse waarin alle gegevens van het Global Stock Ticker-voorbeeld zijn opgeslagen.

De gebruikersinterface en voorbeeldgegevens

De hoofdelementen van de gebruikersinterface zijn:

  • een keuzelijst met invoervak om een landinstelling te selecteren

  • een keuzelijst met invoervak om een markt te selecteren

  • een gegevensraster waarin de gegevens voor zes bedrijven in elke markt staan

  • een grafiek met gesimuleerde historische gegevens voor de aandelen van het geselecteerde bedrijf

Alle voorbeeldgegevens over landinstellingen, markten en bedrijfsaandelen zijn door de toepassing opgeslagen in de StockDataModel-klasse. Een werkelijke toepassing zou de gegevens ophalen van een server en deze vervolgens opslaan in een klasse als StockDataModel. In dit voorbeeld zijn alle gegevens vastgelegd in de StockDataModel-klasse.

Opmerking: De gegevens die worden weergegeven in de financiële grafiek hoeven niet overeen te komen met de gegevens die in het DataGrid-besturingselement worden weergegeven. De grafiek wordt telkens opnieuw getekend wanneer een ander bedrijf wordt geselecteerd. De grafiek dient alleen ter illustratie.

De landinstelling opgeven

Na enkele initiële installatiewerkzaamheden, roept de toepassing de methode Localizer.setLocale() aan om opmaakobjecten voor de standaardlandinstelling te maken. De methode setLocale() wordt ook telkens geroepen wanneer de gebruiker een nieuwe waarde selecteert van de keuzelijst met landinstellingen.

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

Eerst maakt de setLocale()-methode een LocaleID-object. Door dit object kunnen details over de werkelijke landinstelling later gemakkelijker worden opgehaald, indien nodig.

Vervolgens worden nieuwe NumberFormatter-, CurrencyFormatter- en DateTimeFormatter-objecten gemaakt voor de landinstelling. Telkens nadat een Formatter-object wordt gemaakt, wordt de methode traceError() aangeroepen. Deze methode geeft foutberichten en waarschuwingen weer in de console als er een probleem optreedt met de aangevraagde landinstelling. (Een werkelijke toepassing moet reageren op basis van deze fouten en niet alleen maar de fouten traceren.)

Nadat het CurrencyFormatter-object is gemaakt, worden de ISO-valutacode van de opmaakfunctie, het valutasymbool en de fractionalDigits-eigenschappen ingesteld op eerdere vastgestelde waarden door de methode setLocale(). (Deze waarde worden telkens ingesteld wanneer de gebruiker een nieuwe markt kiest uit de keuzelijst met markten.)

Nadat het DateTimeFormatter-object is gemaakt, haalt de methode setLocale() ook een array met afkortingen van de gelokaliseerde namen voor de maanden op.

De gegevens opmaken

De opgemaakte aandelengegevens worden aangeleverd in een DataGrid-besturingselement. De individuele DataGrid-kolommen roepen een labelfunctie aan waarmee de kolomwaarde wordt opgemaakt met het juiste opmaakobject.

In de Flash-versie worden de DataGrid-kolommen bijvoorbeeld ingesteld met de volgende code:

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;

De Flex-versie in het voorbeeld declareert het DataGrid in MXML. Deze versie definieert ook vergelijkbare labelfuncties voor elke kolom.

De labelFunction-eigenschappen verwijzen naar de volgende functies, die de opmaakmethoden van de Localizer-klasse aanroepen:

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

Vervolgens worden de juiste opmaakelementen geconfigureerd en opgehaald door de Localizer-methoden:

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