Formatowanie liczb

Flash Player 10.1 i nowsze wersje, Adobe AIR 2.0 i nowsze wersje

Format wyświetlania wartości liczbowych zależy od regionu, a różnice między poszczególnymi regionami mogą być znaczące. Na przykład liczba 123456,78 zostanie przy różnych ustawieniach narodowych sformatowana w następujący sposób:

Ustawienia regionalne

Format liczby

en-US (angielski, USA)

-123,456.78

de-DE (niemiecki, Niemcy)

-123.456,78

fr-FR (francuski, Francja)

-123 456,78

de-CH (niemiecki, Szwajcaria)

-123'456.78

en-IN (angielski, Indie)

-1,23,456.78

Liczne arabskie ustawienia narodowe

123,456.78-

Na format liczb ma wpływ szereg czynników, między innymi:

  • Separatory. Separator dziesiętny umieszczany jest między częścią całkowitą a częścią ułamkową liczby. Może to być kropka, przecinek lub inny znak. Separatorem grup lub tysięcy może być kropka, przecinek, spacja nierozdzielająca lub inny znak.

  • Sposób grupowania. Między separatorami grup po lewej stronie separatora dziesiętnego mogą znajdować się po dwie, trzy cyfry lub inna ilość cyfr.

  • Symbole wartości ujemnej. Liczby ujemne mogą być wyświetlane ze znakiem minusa po lewej lub po prawej stronie bądź ujęte w nawiasy (w zastosowaniach finansowych). Na przykład liczba minus 19 może być wyświetlana jako -19, 19- lub (19).

  • Zera wiodące i końcowe. Zgodnie z niektórymi konwencjami kulturowymi do wyświetlanych liczb dodawane są wiodące lub końcowe zera. Na przykład wartość 0.17 może być wyświetlana między innymi jako .17, 0.17 lub 0.170.

  • Zestawy cyfr. W różnych językach, np. hindi, arabskim i japońskim, używane są specyficzne zestawy cyfr. Pakiet flash.globalization obsługuje wszelkie zestawy cyfr, które można odwzorować na cyfry 0-9.

Podczas formatowania wartości liczbowych logika klasy NumberFormatter uwzględnia wszystkie te czynniki.

Korzystanie z klasy NumberFormatter

Klasa NumberFormatter formatuje wartości liczbowe (typu int, uint lub Number) zgodnie z konwencjami właściwymi dla konkretnych ustawień narodowych.

Poniższy przykład ilustruje najprostszy sposób sformatowania liczby przy użyciu domyślnych właściwości formatowania udostępnionych przez system operacyjny użytkownika:

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

Wynik zależy od ustawień narodowych i preferencji wybranych przez użytkownika. Na przykład, jeśli ustawienia narodowe użytkownika to fr-FR, sformatowana wartość będzie miała postać:

-123.456,789

Jeśli chcemy po prostu sformatować liczbę zgodnie z określonymi ustawieniami narodowymi, niezależnie od ustawień użytkownika, można podać wprost nazwę ustawień. Na przykład:

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

W tym przypadku wynik jest następujący:

-123'456.789

Parametrem metody formatNumber() jest obiekt Number. Klasa NumberFormatter zawiera także metodę formatInt(), której parametrem jest obiekt typu int, oraz metodę formatUint(), której parametrem jest obiekt uint.

Istnieje możliwość bezpośredniego sterowania logiką formatowania poprzez ustawianie właściwości klasy NumberFormatter, co ilustruje poniższy przykład:

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) 

Przykładowy kod najpierw tworzy obiekt NumberFormatter, a następnie:

  • wybiera format zapisu liczb ujemnych w nawiasach (odpowiedni do zastosowań finansowych);

  • ustawia liczbę cyfr po separatorze dziesiętnym na 5;

  • określa, że ewentualne brakujące miejsca dziesiętne powinny być dopełnione do pięciu zerami końcowymi;

  • jako separator dziesiętny ustawia przecinek;

  • nakazuje niestosowanie separatorów grup.

Uwaga: Zmiana niektórych właściwości powoduje, że uzyskany format liczb nie będzie już zgodny z formatem preferowanym dla danych ustawień narodowych. Niektóre z tych właściwości powinny być używane tylko w sytuacji, gdy rozpoznanie ustawień narodowych nie jest istotne, gdy konieczne jest precyzyjne sterowanie jednym aspektem formatu, jak np. liczba zer wiodących, lub gdy użytkownik ręcznie wprowadza zmiany, np. za pośrednictwem Panelu sterowania systemu Windows.

Analizowanie ciągów zawierających wartości liczbowe

Klasa NumberFormatter umożliwia także wyodrębnianie wartości liczbowych z ciągów znaków, które spełniają wymogi formatowania specyficzne dla konkretnych ustawień narodowych. Metoda NumberFormatter.parseNumber() wyodrębnia pojedynczą wartość liczbową z ciągu znaków. Na przykład:

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

Metoda parseNumber() obsługuje ciągi znaków zawierające tylko cyfry i znaki formatujące liczby, takie jak znaki minusa i separatory. Jeśli ciąg zawiera inna znaki, ustawiany jest kod błędu:

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

W celu wyodrębnienia liczb z ciągów znaków zawierających dodatkowe znaki alfabetyczne można użyć metody 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

Metoda parse() zwraca obiekt NumberParseResult, który zawiera przeanalizowaną wartość liczbową w swojej właściwości wartości. Właściwość startIndex wskazuje na indeks pierwszego znalezionego znaku liczbowego. Można wykorzystać właściwości startIndex oraz endIndex do wyodrębnienia części ciągu przed i po cyfrach.