Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Ausnahmen müssen sein
9 Geschachtelte Typen
10 Besondere Typen der Java SE
11 Generics<T>
12 Lambda-Ausdrücke und funktionale Programmierung
13 Architektur, Design und angewandte Objektorientierung
14 Java Platform Module System
15 Die Klassenbibliothek
16 Einführung in die nebenläufige Programmierung
17 Einführung in Datenstrukturen und Algorithmen
18 Einführung in grafische Oberflächen
19 Einführung in Dateien und Datenströme
20 Einführung ins Datenbankmanagement mit JDBC
21 Bits und Bytes, Mathematisches und Geld
22 Testen mit JUnit
23 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Download:

- Listings, ca. 2,7 MB


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil 5 Der Umgang mit Zeichenketten
Pfeil 5.1 Von ASCII über ISO-8859-1 zu Unicode
Pfeil 5.1.1 ASCII
Pfeil 5.1.2 ISO/IEC 8859-1
Pfeil 5.1.3 Unicode
Pfeil 5.1.4 Unicode-Zeichenkodierung
Pfeil 5.1.5 Escape-Sequenzen/Fluchtsymbole
Pfeil 5.1.6 Schreibweise für Unicode-Zeichen und Unicode-Escapes
Pfeil 5.1.7 Java-Versionen gehen mit dem Unicode-Standard Hand in Hand *
Pfeil 5.2 Datentypen für Zeichen und Zeichenfolgen
Pfeil 5.3 Die Character-Klasse
Pfeil 5.3.1 Ist das so?
Pfeil 5.3.2 Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren
Pfeil 5.3.3 Vom Zeichen zum String
Pfeil 5.3.4 Von char in int: vom Zeichen zur Zahl *
Pfeil 5.4 Zeichenfolgen
Pfeil 5.5 Die Klasse String und ihre Methoden
Pfeil 5.5.1 String-Literale als String-Objekte für konstante Zeichenketten
Pfeil 5.5.2 Konkatenation mit +
Pfeil 5.5.3 String-Länge und Test auf Leer-String
Pfeil 5.5.4 Zugriff auf ein bestimmtes Zeichen mit charAt(int)
Pfeil 5.5.5 Nach enthaltenen Zeichen und Zeichenfolgen suchen
Pfeil 5.5.6 Das Hangman-Spiel
Pfeil 5.5.7 Gut, dass wir verglichen haben
Pfeil 5.5.8 String-Teile extrahieren
Pfeil 5.5.9 Strings anhängen, zusammenfügen, Groß-/Kleinschreibung und Weißraum
Pfeil 5.5.10 Gesucht, gefunden, ersetzt
Pfeil 5.5.11 String-Objekte mit Konstruktoren und aus Wiederholungen erzeugen *
Pfeil 5.6 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil 5.6.1 Anlegen von StringBuilder-Objekten
Pfeil 5.6.2 StringBuilder in andere Zeichenkettenformate konvertieren
Pfeil 5.6.3 Zeichen(folgen) erfragen
Pfeil 5.6.4 Daten anhängen
Pfeil 5.6.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil 5.6.6 Länge und Kapazität eines StringBuilder-Objekts *
Pfeil 5.6.7 Vergleich von StringBuilder-Exemplaren und Strings mit StringBuilder
Pfeil 5.6.8 hashCode() bei StringBuilder *
Pfeil 5.7 CharSequence als Basistyp
Pfeil 5.8 Konvertieren zwischen Primitiven und Strings
Pfeil 5.8.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil 5.8.2 String-Inhalt in einen primitiven Wert konvertieren
Pfeil 5.8.3 String-Repräsentation im Format Binär, Hex und Oktal *
Pfeil 5.8.4 parseXXX(…)- und printXXX()-Methoden in DatatypeConverter *
Pfeil 5.9 Strings zusammenhängen (konkatenieren)
Pfeil 5.9.1 Strings mit StringJoiner zusammenhängen
Pfeil 5.10 Zerlegen von Zeichenketten
Pfeil 5.10.1 Splitten von Zeichenketten mit split(…)
Pfeil 5.10.2 Yes we can, yes we scan – die Klasse Scanner
Pfeil 5.11 Ausgaben formatieren
Pfeil 5.11.1 Formatieren und Ausgeben mit format()
Pfeil 5.12 Zum Weiterlesen
 

Zum Seitenanfang

5.11    Ausgaben formatieren Zur vorigen ÜberschriftZur nächsten Überschrift

Immer wieder müssen Zahlen, Datumsangaben und Text auf verschiedenste Art und Weise formatiert werden. Zur Formatierung bietet Java mehrere Lösungen:

  • Die format(…)- und printf(…)-Methoden erlauben eine formatierte Ausgabe, so wie sie schon seit Urzeiten unter C mit printf(…) gesetzt wurde.

  • Formatieren über Format-Klassen: Allgemeines Formatierungsverhalten wird in einer abstrakten Klasse Format fixiert; konkrete Unterklassen, wie NumberFormat und DateFormat, nehmen sich spezielle Datenformate vor.

  • Umsetzung eines Strings nach einer gegebenen Maske mit einem MaskFormatter

Die Format-Klassen bieten nicht nur landes- und sprachabhängige Ausgaben per format(…), sondern auch den umgekehrten Weg, Zeichenketten wieder in Typen wie double oder Date zu zerlegen. Jede Zeichenkette, die vom Format-Objekt erzeugt wurde, kann auch mit dem Parser wieder eingelesen werden.

 

Zum Seitenanfang

5.11.1    Formatieren und Ausgeben mit format() Zur vorigen ÜberschriftZur nächsten Überschrift

Die Klasse String stellt mit der statischen Methode format(…) eine Möglichkeit bereit, um Zeichenketten nach einer Vorgabe zu formatieren.

[zB]  Beispiel
String s = String.format( "Hallo %s. Es gab einen Anruf von %s.", "Chris", "Joy" );

System.out.println( s ); // Hallo Chris. Es gab einen Anruf von Joy.

Der erste an format(…) übergebene String nennt sich Format-String. Er enthält neben auszugebenden Zeichen weitere sogenannte Formatspezifizierer, die dem Formatierer darüber Auskunft geben, wie er das Argument formatieren soll. %s steht für eine unformatierte Ausgabe eines Strings. Nach dem Format-String folgt ein Vararg (oder alternativ das Array direkt) mit den Werten, auf die sich die Formatspezifizierer beziehen.

Spezifizierer

Steht für …

Spezifizierer

Steht für …

%n

neue Zeile

%b

Boolean

%%

Prozentzeichen

%s

String

%c

Unicode-Zeichen

%d

Dezimalzahl

%x

Hexadezimalschreibweise

%t

Datum und Zeit

%f

Fließkommazahl

%e

wissenschaftliche Notation

Tabelle 5.12    Die wichtigsten Formatspezifizierer im Überblick

[+]  Tipp

Der Zeilenvorschub ist vom Betriebssystem abhängig, und %n gibt uns ein gutes Mittel an die Hand, an dieses Zeilenvorschubzeichen (oder diese Zeichenfolge) zu kommen. Aber statt mit String.format("%n") den Separator zu erfragen, ist System.lineSeparator() eine bessere Lösung.

final class java.lang.String

implements CharSequence, Comparable<String>, Serializable
  • static String format(String format, Object... args)

    Liefert einen formatierten String, der aus dem String und den Argumenten hervorgeht.

  • static String format(Locale l, String format, Object... args)

    Liefert einen formatierten String, der aus der gewünschten Sprache, dem String und den Argumenten hervorgeht.

Intern werkeln java.util.Formatter (keine java.text.Format-Objekte), die sich auch direkt verwenden lassen; dort ist auch die Dokumentation festgemacht.

System.out.printf(…)

Soll eine mit String.format(…) formatierte Zeichenkette gleich ausgegeben werden, so muss dazu nicht System.out.print(String.format(format, args)); angewendet werden. Praktischerweise findet sich zum Formatieren und Ausgeben die aus String bekannte Methode format(…) auch in den Klassen PrintWriter und PrintStream (das System.out-Objekt ist vom Typ PrintStream). Da jedoch der Methodenname format(…) nicht wirklich konsistent mit den anderen printXXX(…)-Methoden ist, haben die Entwickler die format(…)-Methoden auch unter dem Namen printf(…) zugänglich gemacht. (Die Implementierung von printf(…) ist eine einfache Weiterleitung zur Methode format(…).)

[zB]  Beispiel

Gib die Zahlen von 0 bis 15 hexadezimal aus:

for ( int i = 0x0; i <= 0xf; i++ )

System.out.printf( "%x%n", i ); // 0 1 2 ... e f

Auch bei printf(…) ist als erstes Argument ein Locale möglich.

Pimp my String mit Formatspezifizierern *

Die Anzahl der Formatspezifizierer ist so groß und ihre weitere Parametrisierung ist so vielfältig, dass ein Blick in die API-Dokumentation auf jeden Fall nötig ist. Die wichtigsten Spezifizierer sind:

  • %n ergibt das oder die Zeichen für den Zeilenvorschub, jeweils bezogen auf die aktuelle Plattform. Die Schreibweise ist einem harten \n vorzuziehen, da dies nicht das Zeilenvorschubzeichen der Plattform sein muss.

  • %% liefert das Prozentzeichen selbst, wie auch \\ in einem String den Backslash ausmaskiert.

  • %s liefert einen String, wobei null zur Ausgabe »null« führt. %S schreibt die Ausgabe groß.

  • %b schreibt ein Boolean, und zwar den Wert true oder false. Die Ausgabe ist immer false bei null und true bei anderen Typen wie Integer, String. %B schreibt den String groß.

  • %c schreibt ein Zeichen, wobei die Typen Character, Byte und Short erlaubt sind. %C schreibt das Zeichen in Großbuchstaben.

  • Für die ganzzahligen numerischen Ausgaben mit %d (dezimal), %x (hexadezimal), %o (oktal) sind Byte, Short, Integer, Long und BigInteger erlaubt – %X schreibt die hexadezimalen Buchstaben groß.

  • Bei den Fließkommazahlen mit %f oder %e (%E), %g (%G), %a (%A) sind zusätzlich die Typen Float, Double und BigDecimal zulässig. Die Standardpräzision für %e, %E, %f sind sechs Nachkommastellen.

  • Im Fall von Datums-/Zeitangaben mit %t bzw. %T sind erlaubt: Long, Calendar und Date. %t benötigt zwingend ein Suffix.

  • Den Hashcode schreibt %h bzw. %H. Beim Wert null ist auch das Ergebnis die Zeichenkette mit dem Inhalt »null«.

Zusätzliche Flags, etwa für Längenangaben und die Anzahl an Nachkommastellen, sind möglich und werden im folgenden Beispiel gezeigt:

Listing 5.14    src/main/java/com/tutego/insel/string/PrintfDemo.java, main()

PrintStream o = System.out;



int i = 123;

o.printf( "|%d|%d|%n" , i, -i ); // |123|-123|

o.printf( "|%5d|%5d|%n" , i, -i ); // | 123| -123|

o.printf( "|%-5d|%-5d|%n" , i, -i ); // |123 |-123 |

o.printf( "|%+-5d|%+-5d|%n" , i, -i ); // |+123 |-123 |

o.printf( "|%05d|%05d|%n%n", i, -i ); // |00123|-0123|



o.printf( "|%X|%x|%n", 0xabc, 0xabc ); // |ABC|abc|

o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc|



double d = 12345.678;

o.printf( "|%f|%f|%n" , d, -d ); // |12345,678000|-12345,678000|

o.printf( "|%+f|%+f|%n" , d, -d ); // |+12345,678000|-12345,678000|

o.printf( "|% f|% f|%n" , d, -d ); // | 12345,678000|-12345,678000|

o.printf( "|%.2f|%.2f|%n" , d, -d ); // |12345,68|-12345,68|

o.printf( "|%,.2f|%,.2f|%n" , d, -d ); // |12.345,68|-12.345,68|

o.printf( "|%.2f|%(.2f|%n", d, -d ); // |12345,68|(12345,68)|

o.printf( "|%10.2f|%10.2f|%n" , d, -d ); // | 12345,68| -12345,68|

o.printf( "|%010.2f|%010.2f|%n",d, -d ); // |0012345,68|-012345,68|



String s = "Monsterbacke";

o.printf( "%n|%s|%n", s ); // |Monsterbacke|

o.printf( "|%S|%n", s ); // |MONSTERBACKE|

o.printf( "|%20s|%n", s ); // | Monsterbacke|

o.printf( "|%-20s|%n", s ); // |Monsterbacke |

o.printf( "|%7s|%n", s ); // |Monsterbacke|

o.printf( "|%.7s|%n", s ); // |Monster|

o.printf( "|%20.7s|%n", s ); // | Monster|



Date t = new Date();

o.printf( "%tT%n", t ); // 11:01:39

o.printf( "%tD%n", t ); // 12/12/12

o.printf( "%1$te. %1$tb%n", t ); // 12. Dez

Im Fall von Fließkommazahlen werden diese nach dem RoundingMode.HALF_UP gerundet, sodass etwa System.out.printf("%.1f", 0.45); die Ausgabe »0,5« ergibt.

Aus den Beispielen lassen sich einige Flags ablesen, insbesondere bei Fließkommazahlen. Ein Komma steuert, ob Tausendertrenner eingesetzt werden. Ein + gibt an, ob immer ein Vorzeichen erscheint; und ein Leerzeichen besagt, ob dann bei positiven Zeichen ein Platz frei bleibt. Eine öffnende Klammer setzt bei negativen Zahlen kein Minus, sondern setzt diese in Klammern.

[zB]  Beispiel

Gib die Zahlen von 1 bis 10 aus. Die Zahlen 1 bis 9 sollen eine führende Null bekommen.

for ( int i = 1 ; i < 11; i++ )

System.out.printf( "%02d%n", i ); // 01 02 ... 10

Formatspezifizierer für Datumswerte

Aus dem größeren vorangehenden Beispiel wird ersichtlich, dass %t nicht einfach die Zeit ausgibt, sondern immer ein weiteres Suffix erwartet, das genau angibt, welcher Datums-/Zeitteil eigentlich gewünscht ist. Tabelle 5.13 gibt die wichtigsten Suffixe an, und weitere finden Sie in der API-Dokumentation. Alle Ausgaben berücksichtigen die gegebene Locale-Umgebung.

Symbol

Beschreibung

%tA, %ta

vollständiger/abgekürzter Name des Wochentags

%tB, %tb

vollständiger/abgekürzter Name des Monatsnamens

%tC

zweistelliges Jahrhundert (00–99)

%te, %td

Monatstag numerisch ohne bzw. mit führenden Nullen (1–31 bzw. 01–31)

%tk, %tl

Stundenangabe bezogen auf 24 bzw. 12 Stunden (0–23, 1–12)

%tH, %tI

zweistellige Stundenangabe bezogen auf 24 bzw. 12 Stunden (00–23, 01–12)

%tj

Tag des Jahres (001–366)

%tM

zweistellige Minutenangabe (00–59)

%tm

zweistellige Monatsangabe (in der Regel 01–12)

%tS

zweistellige Sekundenangabe (00–59)

%tY

vierstellige Jahresangabe

%ty

die letzten beiden Ziffern der Jahresangabe (00–99)

%tZ

abgekürzte Zeitzone

%tz

Zeitzone mit Verschiebung zur GMT

%tR

Stunden und Minuten in der Form %tH:%tM

%tT

Stunden/Minuten/Sekunden in der Form %tH:%tM:%tS

%tD

Datum in der Form %tm/%td/%ty

%tF

ISO-8601-Format %tY-%tm-%td

%tc

komplettes Datum mit Zeit in der Form %ta %tb %td %tT %tZ %tY

Tabelle 5.13    Suffixe für Datumswerte

Positionsangaben

Im vorangegangenen Beispiel PrintfDemo lautete eine Zeile sinngemäß:

System.out.printf( "%te. %1$tb%n", t );     // 28. Okt

Der Formatierungsstring enthält eine Positionsangabe Position$, bei der sich 1$ auf das erste Argument, 2$ auf das zweite usw. bezieht. (Interessant ist, dass hier die Nummerierung nicht bei null beginnt.)

Die Positionsangabe im Format-String ermöglicht zwei Dinge:

  • Wird, wie in dem Beispiel, das gleiche Argument mehrmals verwendet, ist es unnötig, es mehrmals anzugeben. So wiederholt printf("%te. %tb%n", t, t) das Argument t, was die Angabe einer Position vermeidet. Statt dieser Lösung lässt sich %1$te. %1$tb%n schreiben, also auch für das erste Argument ausdrücklich die Position 1 vorschreiben.

  • Die Reihenfolge der übergebenen Argumente bleibt in der Regel immer gleich, aber der Format-String kann die Argumente an unterschiedliche Positionen setzen.

Der zweite Punkt ist wichtig für lokalisierte Ausgaben. Dazu ein Beispiel: Eine Bildschirmausgabe soll den Vor- und Nachnamen in unterschiedlichen Sprachen ausgeben. Die Reihenfolge der Namensbestandteile kann jedoch unterschiedlich sein, und nicht immer steht in jeder Sprache der Vorname vor dem Nachnamen. Im Deutschen heißt es im Willkommenstext dann »Hallo Christian Ullenboom«, aber in der (erfundenen) Sprache Bwatuti hieße es »Jambo Ullenboom Christian«:

Listing 5.15    src/main/java/com/tutego/insel/string/FormatPosition.java, main()

Object[] formatArgs = { "Christian", "Ullenboom" };



String germanFormat = "Hallo %1$s %2$s";

System.out.printf( germanFormat, formatArgs );

System.out.println();



String bwatutiFormat = "Jambo %2$s %1$s";

System.out.printf( bwatutiFormat, formatArgs );

Die Aufrufreihenfolge für Vor-/Nachname ist immer die gleiche, aber der Format-String, der zum Beispiel extern aus einer Konfigurationsdatei oder Datenbank kommt, kann diese Reihenfolge ändern und so der Landessprache anpassen.

[+]  Tipp

Bezieht sich ein nachfolgendes Formatelement auf das vorangehende Argument, so kann ein < gesetzt werden:

LocalDate c1 = LocalDate.of( 1973, Month.MARCH, 1 );

LocalDate c2 = LocalDate.of( 1985, 9, 2 );

System.out.printf( "%te. %<tb %<ty, %2$te. %<tb %<ty%n",

c1, c2 ); // 1. März 73, 2. Sep. 85

Die Angaben für Monat und Jahr beziehen sich jeweils auf die vorangehenden Positionen. So muss nur einmal c1 und c2 angegeben werden.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.

Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern