Jelenlegi hely

9.4. Számok formázott konvertálása

A szám csomagoló osztályok ugyan rendelkeznek a toString metódussal, de az így létrejövő szöveges forma nem minden esetben megfelelő. Például pénzösszegek valós számként való tárolásánál általában elegendő a két tizedes jegy használata. Formázott konverzióhoz használható a NumberFormat és leszármazottja, a DecimalFormat osztályok a java.text csomagból.

A következő kódrészlet Double objektumot formáz. A getNumberInstance metódus egy NumberFormat objektumot ad vissza. Ennek format metódusa egy Double értéket vár, és formázott String-et állít elő:

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;
numberFormatter = NumberFormat.getNumberInstance();
amountOut = numberFormatter.format(amount);
System.out.println(amountOut);

A kód utolsó sora a következőt írja ki:

345,987.246

Megjegyzés: Az eredmény függ a helyi beállításoktól.

Pénznem formátum

Gazdasági alkalmazás esetén pénzösszegek kezelésére is szükség van. Ennek alkalmazását mutatja a következő kódrészlet:

Double currency = new Double(9876543.21);
NumberFormat currencyFormatter;
String currencyOut;
currencyFormatter = NumberFormat.getCurrencyInstance();
currencyOut = currencyFormatter.format(currency);
System.out.println(currencyOut);

Az utolsó sor kiírja hogy:

876,543.21

A százalék formátum

Százalék formában való kiíráshoz szintén a helyi beállításokat figyelembe vevő objektumot kapunk a getPercentInstance metódus segítségével:

Double percent = new Double(0.75);
NumberFormat percentFormatter;
String percentOut;
percentFormatter = NumberFormat.getPercentInstance();
percentOut = percentFormatter.format(percent);
System.out.println(percentOut);

A printf metódus lehetőségei

A JDK 5.0 tette lehetővé a java.io.PrintStream printf metódusának alkalmazását, amely a kimenet formázását nagyban leegyszerűsítette. A metódus deklarációja:

public PrintStream printf(String format, Object... args)

Az első paraméter azt határozza meg, hogy a további paraméterek milyen formátumban kerüljenek kiírásra. A sokféle lehetőség szerencsére alaposan dokumentálva van az API specifikációban.

Nézzük a következő példát:

Calendar c =...;
String s =
    String.format("Duke's Birthday: %1$tm %1$te,%1$tY",c);

A formátum meghatározás egyszerű. Három van belőlük: %1$tm, %1$te, és %1$tY, amelyek mindegyike elfogadja a c nevű Calendar objektumot. A formátum meghatározás a következőket jelenti:

  • % jelzi a formátum meghatározás kezdetét
  • 1$ az első további paraméter jelzése
  • tm jelenti a hónapot
  • te jelenti a hónap napját
  • tY jelenti az évet

Sablon készítése

A DecimalFormat osztályban meghatározhatjuk egy String minta segítségével a speciális kiírási formátumot. A minta fogja meghatározni, hogy hogyan nézzen ki a megformázott szám. A következő példa készít egy formázót, ami átadja a String mintát a DecimalFormat konstruktorának. A format metódus átvesz egy Double értéket, és formázott String-gel tér vissza.

DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);

A fenti kódsorok kimenete a lenti táblázatban látható.

value értéke pattern értéke eredmény magyarázat
123456.789 ###,###.### 123,456.789 A kettős kereszt (#) utal a számjegyre, a vessző a csoportosítás helyét jelzi, és a pont jelzi a tizedespont helyét.
123456.789 ###.## 123456.79 A value-nak három számjegye van a tizedes pont után, de a pattern-nek csak kettő. A format metódus ezt úgy oldja meg, hogy felkerekíti a számot.
123.78 000000.000 000123.780 A pattern itt a kettős kereszt (#) helyett kezdő és soron következő nullákat definiál.
12345.67 $###,###.### $12,345.67 Az első karakter a pattern-ben a dollár jel ($). Ez annyit jelent, hogy rögtön a balról első számjegy elé kerül.
12345.67 \u00A5###,###.### ¥12,345.67 A pattern beilleszti a Japán pénzt, a yen-t (¥) az Unicode értékével : 00A5.

A formázott szimbólumok módosítása

Erre a feladatra a DecimalFormatSymbols osztályt lehet használni. Ezzel az osztállyal meg tudjuk változtatni a format metódus által már formázott szimbólumokat. Ezek a szimbólumok többek között magukba foglalják a tizedesvesszőt, az ezres csoportosítást, a mínuszjelet, és a százalék jelet.

A következő példa demonstrálja a DecimalFormatSymbols osztályt alkalmazva egy szokatlan számalakra. A szokatlan formátum eredménye a következő metódusok hívása: setDecimalSeparator, setGroupingSeparator, setGroupingSize.

DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');
String strange = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);
String bizarre = weirdFormatter.format(12345.678);
System.out.println(bizarre);

Futtatás során, a példa furcsa alakban jeleníti meg a számot:

1^2345|678