Formatteren met String.format

De klassemethode format()

Vaak willen we allerlei gegevens op een elegante manier afdrukken. Denk maar aan getallen met komma: soms willen we dat er een minimaal of maximaal aantal cijfers na de komma is, of dat er spaties worden toegevoegd aan de cijfers voor de komma.

Om dit alles te doen, kunnen we gebruik maken van de klassemethode format( ) die op de klasse String te vinden is, en die gebruik maakt van de klasse Formatter in de pakket java.util. Dit methode helpt ons bij het formatteren van gegevens.

We illustreren dit met een voorbeeld:

    String text = String.format("I'm %d years old!", 21);

Op de plaats waar we de leeftijd willen invullen, zetten we een format specifier %d. Dit is eigenlijk een gemarkeerd ‘gat’ in de String dat we later zullen invullen. Het % teken markeert deze format specifier en met d geven we aan dat het gaat om een decimaal getal.

Het invullen van dat ‘gat’ gebeurt in de methode format(). We geven hier als eerste parameter de ‘String met gaten’ mee en de volgende parameter (na de komma) is de waarde die in het eerste gat moet ingevuld worden, namelijk de leeftijd.

We kunnen meerdere format specifiers hebben:

    String text = String.format("I'm %d years old and I'm %f metres tall!", 21, 1.75);

De tweede format specifier is een getal met komma. We duiden dit aan met % gevolgd door de letter f (float). Dit tweede getal geven we daarom ook mee als derde parameter.

We kunnen nu de formattering van dit getal wat aanpassen zodat slechts twee cijfers na de komma getoond wodren:

    String text = "I'm %d years old and I'm %.2f metres tall!";

We zetten .2 tussen % en f om aan te geven dat twee cijfers na de komma volstaan. Dit noemen we de precisie.

Overzicht format specifiers

We kunnen nu onze gegevens formatteren. De mogelijkheden zijn zeer uitgebreid, en vaak is het dan ook nuttig om de Java-API-documentatie raad te plegen voor jouw exacte use case, maar hier zijn er een paar handige.

Format specifierData type
bboolean
ccharacter
dinteger
ffloating point
sstring
ewetenschappelijke notatie
nnieuwe regel

Voorbeeld:

    String text = String.format("%b %c %d %f %s %n", true, 'h', 12, 45.2, "hello");

    // true h 12 45,200000 hello

Verder kan men flags toevoegen die extra informatie bevatten over de formattering van de waarde. We sommen er enkele op:

Flag tekenBeschrijving
Lijnt de waarde links uit
+Voorziet een getal van een + of – teken
0Vult een getal vooraan aan met nullen
,Gebruikt scheidingsteken bij duizentallen
(Plaatst negatieve getallen tussen haakjes
Tekens voor “flags”

Ten slotte kan ook nog een width en precision toegevoegd worden. Met width geven we het minimum aantal karakters aan dat afgedrukt moet worden en precision kan onder andere gebruikt worden om het aantal cijfers na de komma te bepalen

    String text = String.format("%-6d %06d %.2f", -125, 145, 123.56789);
    // -125 000145 123.57

System.out.printf

Bij het afdrukken van gegevens op de consolen willen we ook vaak onze gegevens formatteren, en dat kunnen we in één methode doen aan de hand van System.out.printf, wat de gegevens eerst formatteert en dan afdrukt

    System.out.printf("Hello %s", "world");
    // Hello world

Wel opletten dat, in vergelijken met .println(), hier geen newline op het einde wordt toegevoegd.

Opdracht

  • Maak een programma dat de eenheid ‘meter’ omzet naar de eenheid ‘voet’. Toon de waarden van 1 meter tot en met 20 meter (toename van 0,5 meter) en de overeenkomstige waarden in ‘voet’. Zorg dat slechts twee cijfers na de komma getoond worden en dat alle getallen mooi uitgelijnd zijn.
    Console:
    1.00 meter =  3.28 feet
    1.50 meter =  4.92 feet

    2.00 meter =  6.56 feet
    2.50 meter =  8.20 feet

    3.00 meter =  9.84 feet
    3.50 meter = 11.48 feet

    4.00 meter = 13.12 feet
    4.50 meter = 14.76 feet

    5.00 meter = 16.40 feet
    5.50 meter = 18.04 feet