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.
