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.