Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Objektorientierte Beziehungsfragen
7 Ausnahmen müssen sein
8 Äußere.innere Klassen
9 Besondere Typen der Java SE
10 Generics<T>
11 Lambda-Ausdrücke und funktionale Programmierung
12 Architektur, Design und angewandte Objektorientierung
13 Die Klassenbibliothek
14 Einführung in die nebenläufige Programmierung
15 Einführung in Datenstrukturen und Algorithmen
16 Einführung in grafische Oberflächen
17 Einführung in Dateien und Datenströme
18 Einführung ins Datenbankmanagement mit JDBC
19 Einführung in <XML>
20 Testen mit JUnit
21 Bits und Bytes und Mathematisches
22 Die Werkzeuge des JDK
A Java SE Paketübersicht
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 20,0 MB
- Übungsaufgaben, ca. 1,8 MB
- Musterlösungen, ca. 0,8 MB

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenbloom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Rheinwerk Computing
1306 Seiten, gebunden, 11. Auflage
49,90 Euro, ISBN 978-3-8362-2873-2
Pfeil 4 Der Umgang mit Zeichenketten
Pfeil 4.1 Von ASCII über ISO-8859-1 zu Unicode
Pfeil 4.1.1 ASCII
Pfeil 4.1.2 ISO/IEC 8859-1
Pfeil 4.1.3 Unicode
Pfeil 4.1.4 Unicode-Zeichenkodierung
Pfeil 4.1.5 Escape-Sequenzen/Fluchtsymbole
Pfeil 4.1.6 Schreibweise für Unicode-Zeichen und Unicode-Escapes
Pfeil 4.1.7 Java-Versionen gehen mit Unicode-Standard Hand in Hand *
Pfeil 4.2 Die Character-Klasse
Pfeil 4.2.1 Ist das so?
Pfeil 4.2.2 Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren
Pfeil 4.2.3 Ziffern einer Basis *
Pfeil 4.3 Zeichenfolgen
Pfeil 4.4 Die Klasse String und ihre Methoden
Pfeil 4.4.1 String-Literale als String-Objekte für konstante Zeichenketten
Pfeil 4.4.2 Konkatenation mit +
Pfeil 4.4.3 String-Länge und Test auf Leer-String
Pfeil 4.4.4 Zugriff auf ein bestimmtes Zeichen mit charAt( )
Pfeil 4.4.5 Nach enthaltenen Zeichen und Zeichenfolgen suchen
Pfeil 4.4.6 Das Hangman-Spiel
Pfeil 4.4.7 Gut, dass wir verglichen haben
Pfeil 4.4.8 String-Teile extrahieren
Pfeil 4.4.9 Strings anhängen, zusammenfügen, Groß-/Kleinschreibung und Leerraum
Pfeil 4.4.10 Gesucht, gefunden, ersetzt
Pfeil 4.4.11 String-Objekte mit Konstruktoren neu anlegen *
Pfeil 4.5 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil 4.5.1 Anlegen von StringBuilder-/StringBuffer-Objekten
Pfeil 4.5.2 StringBuilder/StringBuffer in andere Zeichenkettenformate konvertieren
Pfeil 4.5.3 Zeichen(folgen) erfragen
Pfeil 4.5.4 Daten anhängen
Pfeil 4.5.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil 4.5.6 Länge und Kapazität eines StringBuilder-/StringBuffer-Objekts *
Pfeil 4.5.7 Vergleichen von String mit StringBuilder und StringBuffer
Pfeil 4.5.8 hashCode() bei StringBuilder/StringBuffer *
Pfeil 4.6 CharSequence als Basistyp
Pfeil 4.7 Strings mit StringJoiner zusammenhängen
Pfeil 4.8 Konvertieren zwischen Primitiven und Strings
Pfeil 4.8.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil 4.8.2 String-Inhalt in einen primitiven Wert konvertieren
Pfeil 4.8.3 String-Repräsentation im Format Binär, Hex, Oktal *
Pfeil 4.8.4 parseXXX(…)- und printXXX()-Methoden in DatatypeConverter *
Pfeil 4.9 Zerlegen von Zeichenketten
Pfeil 4.9.1 Splitten von Zeichenketten mit split(…)
Pfeil 4.9.2 Yes we can, yes we scan – die Klasse Scanner
Pfeil 4.10 Ausgaben formatieren
Pfeil 4.10.1 Formatieren und Ausgeben mit format()
Pfeil 4.11 Zum Weiterlesen
 
Zum Seitenanfang

4.10Ausgaben 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- bzw. 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

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

Die Klasse String stellt mit der statischen Methode format(…) eine Möglichkeit bereit, 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 so genannte Format-Spezifizierer, 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 Feld direkt) mit den Werten, auf die sich die Format-Spezifizierer 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 4.11Die wichtigsten Format-Spezifizierer im Überblick

[+]Tipp

Der Zeilenvorschub ist vom Betriebssystem abhängig, und %n gibt uns ein gutes Mittel an die Hand, um 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 zu 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 16 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 Format-Spezifizierern *

Die Anzahl der Format-Spezifizierer 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 bzw. 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 »null«.

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

Listing 4.15PrintfDemo.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 Modus BigDecimal.ROUND_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

Format-Spezifizierer für Datumswerte

Aus dem größeren 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 4.12 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 Jahrs (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 4.12Suffixe für Datumswerte

Positionsangaben

Im vorangegangenen Beispiel lautete eine Zeile:

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

Die Angabe mit Position$ ist eine Positionsangabe, und so bezieht sich 1$ auf das erste Argument, 2$ auf das zweite usw. (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 %te. %1$tb%n lässt sich natürlich auch %1$te. %1$tb%n schreiben, also auch für das erste Argument ausdrücklich die Position 1 vorschreiben.

  • Die Reihenfolge der Parameter kann immer gleich bleiben, aber der Format-String kann die Reihenfolge später ändern.

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 4.16FormatPosition.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:

Calendar c1 = new GregorianCalendar( 1973, 2, 12 );
Calendar c2 = new GregorianCalendar( 1985, 8, 2 );
System.out.printf( "%te. %<tb %<ty, %2$te. %<tb %<ty%n",
c1, c2 ); // 12. Mrz 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.

 


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
 Zum Katalog
Zum Katalog: Java ist auch eine Insel Java ist auch eine Insel
Jetzt bestellen

 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java SE 8 Standard-Bibliothek
Java SE 8 Standard-Bibliothek


Zum Katalog: Professionell entwickeln mit Java EE 7
Professionell entwickeln mit Java EE 7


Zum Katalog: Schrödinger programmiert Java
Schrödinger programmiert Java


Zum Katalog: Einführung in Java
Einführung in Java


Zum Katalog: Programmieren lernen mit Java
Programmieren lernen mit Java


Zum Katalog: Apps entwickeln für Android 5
Apps entwickeln für Android 5


Zum Katalog: Apps entwickeln mit Android Studio
Apps entwickeln mit Android Studio


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2016
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.

 
Nutzungsbestimmungen | Datenschutz | Impressum

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