Java kiegészítő lecke – Formázott kiíratás

A programozás során sokszor kell valamilyen eredményt kiírnunk a képernyőre, vagy fájlba. Addig nincs is gond, amíg csak egy-két adat kiírásáról van szó, pláne, ha nincs semmilyen követelmény a kiírt adatok igazításával kapcsolatban. Egy ilyen kiíratás egyszerű esetekben teljesen elfogadott:

String nev = "Bela";
int eletkor = 76;
System.out.println( nev+": "+eletkor+" ev" );

Akkor sincs gond, ha esetleg több ember adatairól van szó, hiszen az eredmény ott lesz a képernyőn, maximum nem lesz szép:

Bela 76
Bendeguz 110
Pal 69

Egy darabig esetleg még lehet trükközni azzal, hogy tabulátorokat teszünk a kiíratásba, de azért ez nem a legmegnyugtatóbb megoldás, hiszen ha van egy nagyon hosszú név és egy nagyon rövid, akkor lehet, hogy a tabulátor pozíciók nem fognak egyezni.

Természetesen erre is van megoldás, ez pedig egy String metódus.

String.format()

A String.format() metódus egy nagyon részletesen paraméterezhető, formázott kiíratást megvalósító segédeszköz. Megadhatjuk vele, hogy pontosan mekkora területre szeretnénk egy adott tartalmat igazítani, azon belül pontosan hova, stb.

A metódus több paramétert vár. Először meg kell neki adni, hogy pontosan milyen minta alapján szeretnénk a kiíratást látni, majd fel kell sorolni, hogy milyen értékeket szeretnénk a minta megfelelő pozícióiba illeszteni. Az értékek lehetnek konkrét értékek (literálok), vagy változók, melyek a bennük tárolt értékeket fogják a mintába illeszteni. Lássunk egy példát, úgy egyszerűbb lesz megmagyarázni is.

String[] nevek = new String[] { "Bela", "Bendeguz", "Pal" };
int[] eletkorok = new int[] { 76, 8, 102 };

System.out.println( String.format("%-10s %-9s", "Nev", "Eletkor") );
for( int i = 0; i < nevek.length; i++ )
{
  System.out.println( String.format("%-10s %-9d", nevek[i], eletkorok[i]) );
}

A kimenet:

Nev        Eletkor  
Bela       76       
Bendeguz   8        
Pal        102  

Ez azért már sokkal barátságosabb. Lássuk akkor, mi ez a metódus.

A metódus általános használata így néz ki: String.format( “minta”, adat1, adat2… ); A minta elemei formailag kötöttek, de rengeteg módon paraméterezhetők. A mintában mindig rögzíteni kell az ábrázolandó adatok típusát, és azok sorrendjét. A benne szereplő adatok darabszámának meg kell egyeznie minta után felsorolt literálok vagy változók darabszámával.

Az ábrázolandó adat alapvetően kétféle lehet: számszerű adat, vagy String. Számadatok esetén arra is lehetőség van, hogy 8-as és 16-os számrendszerbe át is váltsuk az egész értékeket.  A mintában minden egyes megjelenítendő változó pozícióját egy % jel vezeti be. Lássunk akkor a teljesség igénye nélkül egy részletesebb listát, konkrét példákkal. Minden sor egy adott mintával kezdődik, mögötte pedig a magyarázat, hogy az mit és hogyan jelenít meg.

%s Szöveges adat.
%d Egész szám.
%f Lebegőpontos szám alapértelmezetten 6 tizedes jeggyel.
%10s Szöveges adat 10 karakteres mezőmérettel jobbra igazítva. Ha a mezőméret nagyobb, mint a megjelenítendő szöveg, szóközökkel egészíti ki, ha a szöveg nagyobb, akkor a teljes szöveg megjelenik.
%-10s Szöveges adat 10 karakteres mezőmérettel balra igazítva.
%3d Egész szám, 3 karakteres mezőmérettel jobbra igazítva. Ha a szám több, mint mezőméretnyi számjeggyel rendelkezik, akkor a teljes szám megjelenik. Ha kisebb, szóközökkel egészül ki. A mezőméretbe a tizedes vesző vagy pont is beleszámít.
%-3d Egész szám, 3 karakteres mezőmérettel balra igazítva.
%03d Egész szám, 3 karakteres mezőmérettel jobbra igazítva. Ha a szám kevesebb számjegyből áll, mint a mezőméret, akkor nullákkal egészíti ki.
%.3f Lebegőpontos szám 3 tizedes jeggyel jobbra igazítva.
%8.3f Lebegőpontos szám 8 karakteres mezőmérettel 3 tizedes jeggyel jobbra igazítva.
%-8.3f Lebegőpontos szám 8 karakteres mezőmérettel 3 tizedes jeggyel balra igazítva.
%+d Egész szám, előjeles megjelenítéssel (a pozitív előjel is kiírva).
%+.3f Lebegőpontos szám, előjeles megjelenítéssel, 3 tizedesjeggyel
%,d Egész szám, 3 számjegyenkénti szóközzel a könnyebb olvashatóságért (ezres csoportosítás)
%,f Lebegőpontos szám, 3 számjegyenkénti szóközzel a könnyebb olvashatóságért (ezres csoportosítás)
%% A százalékjel megjelenítése.
%n Sordobás az aktuális helyen.
%x Egész szám, hexadecimális formában (16-os számrendszerben) jobbra igazítva.
%-x Egész szám, hexadecimális formában balra igazítva.
%-8x Egész szám, hexadecimális formában balra igazítva 8 karakteres mezőmérettel.
%08x Egész szám, hexadecimális formában, 8 karakteres mezőmérettel, balról nullákkal kiegészítve.
%o Egész szám, oktális formában (8-as számrendszer) jobbra igazítva.
%-o Egész szám, oktális formában balra igazítva.
%-8o Egész szám, oktális formában balra igazítva 8 karakteres mezőmérettel.
%08o Egész szám, oktális formában, 8 karakteres mezőmérettel, balról nullákkal kiegészítve.
%,+025.3f Lebegőpontos szám, ezres csoportosítással, jobbra igazítva, előjeles megjelenítéssel, 25 karakteres mezőmérettel, balról nullákkal feltöltéssel, 3 tizedesjegy pontossággal.

Az utolsó példában látható, hogy a fent említett alap formázások akár a végletekig paraméterezve egyszerre is használhatók, már amennyiben van értelme. Mert egész szám esetén például nincs értelme tizedesjegyeknek, ilyen esetekben futási hibát eredményez a helytelen használat. Balra igazítás esetén sincs értelme a balról nullákkal feltöltésnek, ezért ez is futási hibával jár.

Lássunk akkor egy példát, ahol kutyák adatait listázzuk ki, igazítva. Az egyszerűség kedvéért a tároló osztályt most nem rakom külön fájlba, ilyenkor a Kutya osztálynak nem szabad publikusnak lennie, mivel minden publikus osztálynak azonos nevű .java fájlban kell lennie. Ezért egy fájlban csak egy publikus osztály lehet.

package formazottkiiratas;

class Kutya
{
  String nev;
  char nem;
  int kor;
  double tomeg;
  boolean ivartalanitott;

  public Kutya(String nev, char nem, int kor, double tomeg, boolean ivart)
  {
    this.nev = nev;
    this.nem = nem;
    this.kor = kor;
    this.tomeg = tomeg;
    this.ivartalanitott = ivart;
  }
}

public class FormazottKiiratas
{
  public static void main(String[] args)
  {
    Kutya[] kutyak = new Kutya[3];
    kutyak[0] = new Kutya("Bodri", 'K', 2, 25.0123456789, true);
    kutyak[1] = new Kutya("Nokedli", 'K', 11, 52.9285, false);
    kutyak[2] = new Kutya("Netti", 'S', 7, 33.5, true);
    
    for( Kutya k : kutyak )
    {
      System.out.println(String.format("%-8s %3s %3d %7.3f %s",
                         k.nev, k.nem, k.kor, k.tomeg, k.ivartalanitott));
    }
  }

A kimenet:

Bodri      K   2  25,012 true
Nokedli    K  11  52,929 false
Netti      S   7  33,500 true

A fentiek alapján már lehet kísérletezni ezzel a metódussal, és remélhetőleg megkönnyíti bizonyos emelt informatika érettségi programozási feladaton belül a kiíratással kapcsolatos kihívásokat.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

*

Ez a weboldal az Akismet szolgáltatását használja a spam kiszűrésére. Tudjunk meg többet arról, hogyan dolgozzák fel a hozzászólásunk adatait..