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.