Gids voor java.util.Formatter

1. Overzicht

In dit artikel bespreken we de Draad formatteren in Java met behulp van de java.util.Formatter class, die ondersteuning biedt voor de rechtvaardiging en uitlijning van de lay-out.

2. Hoe u het Formatter

Onthoud C's printf? Formatteren van een Draad op Java lijkt erg op elkaar.

De formaat() methode van de Formatter wordt blootgesteld via een statische methode van de Draad klasse. Deze methode accepteert een sjabloon Draad en een lijst met argumenten om de sjabloon mee te vullen:

String greetings = String.format ("Hallo mensen, welkom bij% s!", "Baeldung");

Het resultaat Draad is:

"Hallo mensen, welkom in Baeldung!"

Een sjabloon is een Draad die wat statische tekst en een of meer indelingsspecificaties bevat, die aangeven welk argument op de specifieke positie moet worden geplaatst.

In dit geval, er is een enkele formaatspecificatie % s, die wordt vervangen door het overeenkomstige argument.

3. Formaatspecificaties

3.1. Algemene syntaxis

De syntaxis van indelingsspecificaties voor Algemeen, karakter, en Numeriek type is:

% [argument_index $] [vlaggen] [breedte] [. precisie] conversie

Specificaties argument_index, vlag, breedte, en precisie zijn optioneel.

  • argument_index deel is een geheel getal ik - aangeeft dat de ith argument uit de argumentenlijst moet hier worden gebruikt
  • vlaggen is een set tekens die wordt gebruikt om het uitvoerformaat te wijzigen
  • breedte is een positief geheel getal dat het minimum aantal tekens aangeeft dat naar de uitvoer moet worden geschreven
  • precisie is een geheel getal dat gewoonlijk wordt gebruikt om het aantal tekens te beperken, waarvan het specifieke gedrag afhangt van de conversie
  • is het verplichte gedeelte. Het is een teken dat aangeeft hoe het argument moet worden opgemaakt. De set geldige conversies voor een bepaald argument is afhankelijk van het gegevenstype van het argument

Als we in ons bovenstaande voorbeeld het nummer van een argument expliciet willen specificeren, kunnen we het schrijven met 1$ en 2$ argumentindices.

Beide zijn respectievelijk het eerste en het tweede argument:

String greetings = String.format ("Hallo% 2 $ s, welkom bij% 1 $ s!", "Baeldung", "Folks");

3.2. Voor Datum Tijd Vertegenwoordiging

% [argument_index $] [vlaggen] [breedte] conversie

Nogmaals de argument_index, vlaggen, en breedte zijn optioneel.

Laten we een voorbeeld nemen om dit te begrijpen:

@Test public void whenFormatSpecifierForCalendar_thenGotExpected () {Calendar c = new GregorianCalendar (2017, 11, 10); String s = String.format ("De datum is:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("De datum is: 12 10,2017", s); }

Hier wordt voor elke formaatspecificatie het eerste argument gebruikt, dus 1$. Hier als we de argument_index voor de 2e en 3e formaatspecificatie probeert het 3 argumenten te vinden, maar we moeten hetzelfde argument gebruiken voor alle 3 de formaatspecificaties.

Dus het is oké als we niet specificeren argument _index voor de eerste, maar we moeten deze specificeren voor de andere twee.

De vlag hier bestaat uit twee karakters. Waar het eerste teken altijd een is 'T' of ‘T '. Het tweede personage hangt af van welk deel van Kalender moet worden weergegeven.

In ons voorbeeld zijn de eerste formaatspecificaties tm, geeft maand aan in twee cijfers, te geeft de dag van de maand aan en tY aangegeven jaar in vier cijfers.

3.3. Formaatspecificaties zonder argumenten

% [vlaggen] [breedte] conversie

Het optionele vlaggen en breedte zijn hetzelfde als gedefinieerd in bovenstaande secties.

De nodige conversie is een personage of Draad geeft inhoud aan die in de uitvoer moet worden ingevoegd. Momenteel zijn alleen de ‘%' en nieuwe regel ‘N ' kan worden afgedrukt met:

@Test public void whenNoArguments_thenExpected () {String s = String.format ("John scoorde 90 %% in het herfstsemester"); assertEquals ("John scoorde 90% in het herfstsemester", s); } 

Binnen formaat(), als we willen afdrukken ‘%' - we moeten eraan ontsnappen door ‘%%'.

4. Conversies

Laten we nu eens kijken naar elk detail van de syntaxis van de opmaakspecificatie, te beginnen met een conversie. Merk op dat u alle details kunt vinden in het Formatter javadocs.

Zoals we in de bovenstaande voorbeelden hebben opgemerkt, conversie part is vereist in alle formaatspecificaties en kan worden onderverdeeld in verschillende categorieën.

Laten we ze allemaal bekijken aan de hand van voorbeelden.

4.1. Algemeen

Wordt gebruikt voor elk type argument. De algemene conversies zijn:

  1. ‘B’ of ‘B ' - voor Boolean waarden
  2. ‘H’ of ‘H ' - voor HashCode
  3. ‘S ' of ‘S ' - voor Draad, als nul, het drukt "null" af, anders arg.toString ()

We zullen nu proberen weer te geven boolean en Draad waarden, met behulp van de bijbehorende conversies:

@Test openbare leegte gegevenString_whenGeneralConversion_thenConvertedString () {String s = String.format ("Het juiste antwoord is% s", false); assertEquals ("Het juiste antwoord is onwaar", s); s = String.format ("Het juiste antwoord is% b", null); assertEquals ("Het juiste antwoord is onwaar", s); s = String.format ("Het juiste antwoord is% B", true); assertEquals ("Het juiste antwoord is WAAR", s); }

4.2. Karakter

Gebruikt voor de basistypen die Unicode-tekens vertegenwoordigen: char, Character, byte, Byte, short, en Kort. Deze conversie kan ook worden gebruikt voor de typen int en Geheel getal wanneer de Character.isValidCodePoint (int) geeft terug waar voor hen.

Het kan worden geschreven als ‘C’ of ’C’ gebaseerd op de case die we willen.

Laten we proberen enkele karakters af te drukken:

@Test openbare leegte gegevenString_whenCharConversion_thenConvertedString () {String s = String.format ("Het juiste antwoord is% c", 'a'); assertEquals ("Het juiste antwoord is een", s); s = String.format ("Het juiste antwoord is% c", null); assertEquals ("Het juiste antwoord is null", s); s = String.format ("Het juiste antwoord is% C", 'b'); assertEquals ("Het juiste antwoord is B", s); s = String.format ("Het geldige Unicode-teken:% c", 0x0400); assertTrue (Character.isValidCodePoint (0x0400)); assertEquals ("Het geldige Unicode-teken: Ѐ", s); }

Laten we nog een voorbeeld nemen van een ongeldig codepunt:

@Test (verwacht = IllegalFormatCodePointException.class) public void whenIllegalCodePointForConversion_thenError () {String s = String.format ("Het geldige Unicode-teken:% c", 0x11FFFF); assertFalse (Character.isValidCodePoint (0x11FFFF)); assertEquals ("Het geldige Unicode-teken: Ā", s); }

4.3. Numeriek - Integraal

Deze worden gebruikt voor Java-integraaltypen: byte, Byte, short, Short, int en Geheel getal, lang, lang, en BigInteger. Er zijn drie conversies in deze categorie:

  1. ‘D ' - voor decimaal getal
  2. 'O' - voor octaal getal
  3. 'X' of 'X' - voor hexadecimaal getal

Laten we proberen elk van deze af te drukken:

@Test public void whenNumericIntegralConversion_thenConvertedString () {String s = String.format ("Het getal 25 in decimaal =% d", 25); assertEquals ("Het getal 25 in decimaal = 25", s); s = String.format ("Het getal 25 in octaal =% o", 25); assertEquals ("Het getal 25 in octaal = 31", s); s = String.format ("Het getal 25 in hexadecimaal =% x", 25); assertEquals ("Het getal 25 in hexadecimaal = 19", s); }

4.4. Numeriek - drijvende komma

Gebruikt voor Java-typen met drijvende komma: float, Float, double, Double, en BigDecimal

  1. 'E' of 'E'opgemaakt als een decimaal getal in geautomatiseerde wetenschappelijke notatie
  2. ‘F 'opgemaakt als een decimaal getal
  3. ‘G ' of ‘G 'op basis van de nauwkeurigheidswaarde na afronding, wordt deze conversie opgemaakt in geautomatiseerde wetenschappelijke notatie of decimaal formaat

Laten we proberen de getallen met drijvende komma af te drukken:

@Test public void whenNumericFloatingConversion_thenConvertedString () {String s = String.format ("Het geautomatiseerde wetenschappelijke formaat van 10000.00" + "=% e", 10000.00); assertEquals ("Het geautomatiseerde wetenschappelijke formaat van 10000.00 = 1.000000e + 04", s); String s2 = String.format ("Het decimale formaat van 10.019 =% f", 10.019); assertEquals ("Het decimale formaat van 10.019 = 10.019000", s2); }

4.5. Andere conversies

  • Datum Tijd - voor Java-typen die een datum of tijd kunnen coderen: lang, lang, kalender, Datum en TemporalAccessor. Hiervoor moeten we een prefix gebruiken 'T' of ‘T ', zoals we eerder zagen
  • Procent - drukt een letterlijke ‘% '(‘ \ U0025')
  • Lijnscheidingsteken - drukt een platformspecifiek lijnscheidingsteken af

Laten we eens kijken naar een eenvoudig voorbeeld:

@Test openbare leegte whenLineSeparatorConversion_thenConvertedString () {String s = String.format ("Eerste regel% nSecond regel"); assertEquals ("Eerste regel \ n" + "Tweede regel", s); }

5. Vlaggen

Vlaggen worden in het algemeen gebruikt om de uitvoer te formatteren. Terwijl in het geval van datum en tijd, ze worden gebruikt om aan te geven welk deel van de datum moet worden weergegeven, zoals we zagen in het voorbeeld van sectie 4.

Er zijn een aantal vlaggen beschikbaar, waarvan een lijst te vinden is in de documentatie.

Laten we een voorbeeld van een vlag bekijken om het gebruik ervan te begrijpen. ‘-‘ wordt gebruikt om de uitvoer op te maken zoals links uitgelijnd:

@Test public void whenSpecifyFlag_thenGotFormattedString () {String s = String.format ("Zonder links uitgevulde vlag:% 5d", 25); assertEquals ("Zonder links uitgevulde vlag: 25", s); s = String.format ("Met links uitgevulde vlag:% -5d", 25); assertEquals ("Met links uitgevulde vlag: 25", s); }

6. Precisie

Voor algemene conversies, precisie is slechts het maximale aantal tekens dat naar de uitvoer moet worden geschreven. Terwijl, f of de drijvende-komma-conversies, de precisie het aantal cijfers na het radixpunt is.

De eerste verklaring is een voorbeeld van precisie met getallen met drijvende komma, en de tweede met algemene conversies:

@Test public void whenSpecifyPrecision_thenGotExpected () {String s = String.format ("Uitvoer van 25.09878 met precisie 2:% .2f", 25.09878); assertEquals ("Output van 25.09878 met precisie 2: 25.10", s); String s2 = String.format ("Uitvoer van algemeen conversietype met precisie 2:% .2b", true); assertEquals ("Uitvoer van algemeen conversietype met precisie 2: tr", s2); }

7. Argumentenindex

Zoals eerder vermeld, is hetargument_index is een geheel getal dat de positie van het argument in de lijst met argumenten aangeeft. 1$ geeft het eerste argument aan, 2$ het tweede argument, enzovoort.

Er is ook een andere manier om op positie naar argumenten te verwijzen, door de ‘<‘ (‘\ U003c ') vlag, wat betekent dat het argument van de vorige formaatspecificatie zal worden hergebruikt. Deze twee instructies zouden bijvoorbeeld dezelfde uitvoer opleveren:

@Test openbare leegte whenSpecifyArgumentIndex_thenGotExpected () {Calendar c = Calendar.getInstance (); String s = String.format ("De datum is:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("De datum is: 12 10,2017", s); s = String.format ("De datum is:% tm%<>

8. Andere manieren van gebruik Formatter

Tot nu toe zagen we het gebruik van formaat() methode van de Formatter klasse. We kunnen ook een Formatter instantie, en gebruik dat om de formaat() methode.

We kunnen een instantie maken door een Toepasbaar, OutputStream, het dossier of bestandsnaam. Op basis hiervan worden de geformatteerde Draad wordt opgeslagen in een Toepasbaar, OutputStream, het dossier respectievelijk.

Laten we een voorbeeld bekijken van het gebruik ervan met een Toepasbaar. We kunnen het op dezelfde manier met anderen gebruiken.

8.1. Gebruik makend van Formatter Met Toepasbaar

Laten we een S makentringBuilder voorbeeld sben maak een Formatter het gebruiken. Dan zullen we een beroep doen formaat() om een Draad:

@Test openbare leegte whenCreateFormatter_thenFormatterWithAppendable () {StringBuilder sb = nieuwe StringBuilder (); Formatter-formatter = nieuwe Formatter (sb); formatter.format ("Ik schrijf naar een% s instantie.", sb.getClass ()); assertEquals ("Ik schrijf naar een klasse java.lang.StringBuilder Instance.", sb.toString ()); }

9. Conclusie

In dit artikel hebben we de opmaakmogelijkheden gezien die worden geboden door de java.util.Formatter klasse. We hebben verschillende syntaxis gezien die kunnen worden gebruikt om het Draad en de conversietypen die kunnen worden gebruikt voor verschillende datatypes.

Zoals gewoonlijk is de code voor de voorbeelden die we hebben gezien te vinden op Github.