Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (3. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Buch: Java ist auch eine Insel
gp Kapitel 4 Der Umgang mit Zeichenketten
  gp 4.1 Strings und deren Anwendung
    gp 4.1.1 String-Objekte für konstante Zeichenketten
    gp 4.1.2 String-Länge
    gp 4.1.3 Gut, dass wir verglichen haben
    gp 4.1.4 String-Teile extrahieren
    gp 4.1.5 Suchen und Ersetzen
    gp 4.1.6 Veränderte Strings liefern
    gp 4.1.7 Typen in Zeichenketten konvertieren
  gp 4.2 Veränderbare Zeichenketten mit der Klasse StringBuffer
    gp 4.2.1 Anlegen von StringBuffer-Objekten
    gp 4.2.2 Die Länge eines StringBuffer-Objekts lesen und setzen
    gp 4.2.3 Daten anhängen
    gp 4.2.4 Zeichen(folgen) setzen, erfragen, löschen und umdrehen
  gp 4.3 Vergleiche von Zeichenketten als String und StringBuffer
    gp 4.3.1 Sollte es ein equals() und hash() bei StringBuffer geben?
  gp 4.4 Zeichenkodierungen umwandeln
  gp 4.5 Sprachabhängiges Vergleichen mit der Collator-Klasse
    gp 4.5.1 Effiziente interne Speicherung für die Sortierung
  gp 4.6 Die Klasse StringTokenizer
  gp 4.7 StreamTokenizer
  gp 4.8 Der BreakIterator als Wort- und Satztrenner
  gp 4.9 Formatieren mit Format-Objekten
    gp 4.9.1 Prozente, Zahlen und Währungen ausgeben
    gp 4.9.2 Ausgaben formatieren
    gp 4.9.3 Dezimalzahlformatierung
  gp 4.10 Reguläre Ausdrücke
    gp 4.10.1 Splitten von Zeichenketten
    gp 4.10.2 split() in String
    gp 4.10.3 Das Paket org.apache.regexp


Galileo Computing

4.9 Formatieren mit Format-Objekten downtop

Zahlen, Datumsangaben und Text können auf verschiedenste Art und Weise formatiert werden. Unter Java wird dieses Formatierungsverhalten in einer abstrakten Klasse Format fixiert. Sie definiert die Funktionalität, um zum einen (landes-)sprachabhängige Ausgaben zu erzeugen und zum anderen eingegebene Zeichenketten entsprechend zu zerlegen. Dazu stellt die Klasse Format die Methoden format() und parseObject() bereit. Jede Zeichenkette, die vom Format-Objekt erzeugt wurde, ist auch mit dem Parser wieder einlesbar.

Im Java SDK erweitern drei Klassen Format: DateFormat, MessageFormat und NumberFormat. Sie übernehmen die Ein-/Ausgabe für Datumsangaben, für allgemeine Programmmeldungen und für Zahlen. Das Beispiel in der Tabelle zeigt Anwendungen der Klassen.

ErgebnisFormatiert mit
Tabelle 4.1 Beispiele für konkrete Format-Klassen
23 August 1998 DateFormat
$12,349.001 NumberFormat
plus 1 ist 2 MessageFormat

Jede dieser Klassen implementiert auf jeden Fall die Methode zur Ausgabe format() und zur Erkennung parseObject().

abstract class java.text.Format
implements Serializable, Cloneable

gp  String format( Object obj )
Formatiert das Objekt obj und gibt eine Zeichenkette zurück.
gp  abstract StringBuffer format( Object obj,
StringBuffer toAppendTo, FieldPosition pos )
Formatiert ein Objekt und hängt den Text an den angegebenen StringBuffer an. Kann die Zeichenkette nicht mit format() nach den Regeln des Format-Objekts ausgegeben werden, löst die Methode eine IllegalArgumentException aus. Ist die Formatierungsanweisung falsch, so gibt format() das Unicode-Zeichen \uFFFD zurück.
gp  Object parseObject( String source )
Parsed den Text von Anfang an.
gp  abstract Object parseObject( String source, ParsePosition pos )
Der Text wird ab der Stelle pos umgewandelt. Konnte parseObject() die Zeichenkette nicht zurückübersetzen, so folgt eine ParseException. parseObject(String, ParsePosition) verändert das ParsePosition-Objekt nicht und gibt die Null-Referenz zurück.
gp  Object clone()
Gibt eine Kopie zurück.

Die Mehrzahl der Format-Unterklassen implementiert auch die folgenden Methoden:

gp  static XXXFormat getInstance()
Für ein Formatierungsobjekt mit den Formatierungsregeln für das voreingestellte Land.
gp  static XXXFormat getInstance( Locale l )
Für ein Formatierungsobjekt mit den Formatierungsregeln für das angegebene Land.

Einige der Unterklassen implementieren ein noch spezielleres Verhalten. So zum Beispiel die Klasse NumberFormat, die mit getPercentInstance() und getCurrencyInstance() zwei Methoden zum angepassten Formatieren dieser speziellen Arten von Zahlen bietet.

Die Unterklassen von Format erlauben es dem Benutzer auch, weitere Objekte zu erzeugen, die an die speziellen Sprachbesonderheiten weiterer Länder angepasst sind. Unterklassen, die dem Benutzer diese Möglichkeiten erlauben, sollten die Abfrage der unterstützten Länder mit

public static Locale[] getAvailableLocales()

ebenso implementieren.


Galileo Computing

4.9.1 Prozente, Zahlen und Währungen ausgeben downtop

Für die häufigen Ausgaben als Prozentzahlen oder als Währungszahlen gibt es die speziellen statischen Funktionen getPercentInstance(), getNumberInstance(), getIntegerInstance() und getCurrencyInstance() jeweils in der parameterlosen Variante und in der Variante mit einem Locale-Objekt.

Beispiel Gib eine Prozentzahl prozent im Bereich von 0 bis 100 aus.

Listing 4.5 ProzenteGeben.java

import java.text.NumberFormat;
 
public class ProzenteGeben
{
  public static void main( String args[] )
  {
    double prozent = 45.3;
    NumberFormat nf = NumberFormat.getPercentInstance();
    System.out.println( nf.format(prozent/100) );
  }
}


Galileo Computing

4.9.2 Ausgaben formatieren downtop

MessageFormat ist eine konkrete Unterklasse der abstrakten Klasse Format. Sie dient dazu, Nachrichten sprachunabhängig zu erzeugen. Das heißt, die tatsächliche sprachabhängige Ausgabe wird so weit wie möglich nach hinten geschoben und erst dann erzeugt, wenn die Nachricht dem Benutzer angezeigt werden soll. Durch MessageFormat werden nur Formatierungsanweisungen gegeben, und die wirklichen Informationen (also die Objekte als Informationsträger) werden zur Laufzeit eingesetzt. Dabei enthalten die Formatierungsanweisungen Platzhalter für diese Objekte (ähnlich wie printf() in C(++)). In der Regel werden Daten (die Argumente) erst zur Laufzeit ermittelt, wie etwa die Zeilennummer einer Fehlerstelle in einer Eingabedatei.

Beispiel   Eine Anwendung des Formatierers. Der format()-Befehl formatiert die Argumente, die in einem Objekt-Feld abgelegt sind, mit dem Aussehen, wie es im Konstruktor des MessageFormat-Objekts angegeben wurde.
Object testArgs[] = { new Long(31415), "SchnelleLotte" };
 
MessageFormat form = new MessageFormat(
    "Anzahl Dateien auf der Festplatte \"{1}\": {0}." );
System.out.println( form.format(testArgs) );

Die Ausgabe mit unterschiedlichen testArgs ist:

Anzahl Dateien auf der Festplatte "SchnelleLotte": 0.
Anzahl Dateien auf der Festplatte "SchnelleLotte": 1.
Anzahl Dateien auf der Festplatte "SchnelleLotte": 31,415.

Die Argumente aus dem Array werden über die Platzhalter wie {0} in die Nachricht eingefügt. Die Nummern entsprechen der Reihenfolge der Argumente im Array. Einige Einträge im Array können ungenutzt bleiben. Fehlt allerdings das einem Platzhalter entsprechende Element im Feld, so wird eine ParseException geworfen.

class java.text.MessageFormat
extends Format

gp  MessageFormat( String pattern )
Erzeugt ein MessageFormat-Objekt mit dem angegebenen Pattern.

Gegenüber anderen Format-Klassen zeigt die Klasse MessageFormat eine Besonderheit im Erzeugen. MessageFormat-Objekte werden über ihren Konstruktor erzeugt und nicht über getInstance(). Der Grund ist, dass üblicherweise die Erzeugungsmethoden - damit sind die getInstance()-Varianten gemeint - eine komplexe Initialisierung durchlaufen, die die landesspezifischen Einstellungen festlegen. MessageFormat ist aber nicht an eine bestimmte Sprache gebunden, benötigt folglich auch keine Initialisierung.

Bildungsgesetz für Message-Formate

Der Mustertext für eine Nachricht kann für die einzelnen Platzhalter eine bestimmte Art der Formatierung vorschreiben. Ein Bildungsgesetz in Form einer Grammatik schreibt die Bauweise vor:

messageFormatPattern :=
  string ( "{" messageFormatElement "}" string )*
messageFormatElement := argument { "," elementFormat }
elementFormat := "time" { "," datetimeStyle }
  | "date" { "," datetimeStyle }
  | "number" { "," numberStyle }
  | "choice" { "," choiceStyle }
datetimeStyle := "short"
  | "medium"
  | "long"
  | "full"
  | dateFormatPattern
numberStyle := "currency"
  | "percent"
  | "integer"
  | numberFormatPattern
choiceStyle := choiceFormatPattern
Tabelle 4.2 Bedeutung der Metazeichen
* Die Angabe kann beliebig wiederholt werden.
{} Optionales. Kann vorkommen, muss aber nicht.
() Bildung von Gruppen, um größere Wiederholungen zu beschreiben
| Definition von Alternativen. Entweder das eine oder das andere

Hinweis   Bei den geschweiften Klammern besteht Verwechslungsgefahr zwischen Message-Platzhalter oder normalem Zeichen. Das ist insbesondere ein Problem, wenn die Nachricht mit den Platzhaltern eine beliebige Datei ist (etwa ein Java-Programm, in dem der Name der Klasse durch einen Platzhalter angedeutet ist). Dann muss jede normale geschweifte Klammer { durch \'{' ersetzt werden.

Beispiel   Die Klasse MessageFormat in der Praxis:

Listing 4.6 MessageFormatDemo.java

import java.text.*;
import java.util.*;
 
public class MessageFormatDemo
{
  public static void main( String args[] )
  {
    Object[] arguments = {
      new Date(System.currentTimeMillis()),
      "die Antwort auf alle Fragen",
      new Integer(42)
    };
    String result = MessageFormat.format(
      "Am {0,date} um {0,time} ist {1} wie immer {2,number,integer}.",
      arguments );
 
    System.out.println( result );
  }
}

Dies erzeugt die Ausgabe:

Am 21.09.2001 um 23:08:08 ist die Antwort auf alle Fragen wie immer 42.


Galileo Computing

4.9.3 Dezimalzahlformatierungtoptop

Die Klasse DecimalFormat dient zur formatierten Ausgabe von Zahlen. Dem Konstruktor wird ein Formatierungs-String übergeben, sozusagen eine Vorlage, wie die Zahlen zu formatieren sind. Die Formatierung einer Zahl durch DecimalFormat erfolgt mit Rücksicht auf die aktuell eingestellte Sprache.

Listing 4.7 DezimalFormatTest.java

import java.text.*;

public class DezimalFormatTest
{
  public static void main( String args[] )
  {
    double d = 12345.67890;
    DecimalFormat df = new DecimalFormat( "###,##0.00" );
    System.out.println( df.format(d) );           // 12.345,68
  }
}

Der Formatierungsstring kann eine Menge von Formatierungsanweisungen vertragen.

SymbolBedeutung
Tabelle 4.3 Formatierungsanweisungen für DecimalFormat
0 Repräsentiert eine Ziffer.
# Eine Ziffer; Ist an dieser Stelle keine angegeben, bleibt die Stelle leer.
. Trennt Vor- und Nachkommastellen.
, Gruppiert die Ziffern (eine Gruppe ist so groß wie der Abstand von ',' zu '.').
; Trennzeichen für mehrere Formate
- Das Standardzeichen für das Negativpräfix
% Die Zahl wird mit 100 multipliziert und als Prozentwert ausgewiesen.
%% Genau wie % nur mit Promille
- Nationales Währungssymbol (DM für Deutschland)
-- Internationales Währungssymbol (DEM für Deutschland)
X Alle anderen Zeichen können ganz normal benutzt werden.
' Ausmarkieren von speziellen Symbolen im Präfix oder Suffix

Beispiel   Auswirkungen der Formatanweisungen auf die Zahlen 12345.6789, 400.56, 1234567.789, 5.815 und -42.17

FormatZahlErgebnis
Tabelle 4.4 Beispiel für verschiedene Formatanweisungen
####,###.##- 12345.6789 12.345,68 DM
####,###.##- 400.56 400,56 DM
####,###.##- 1234567.789 1.234.567,79 DM
####,###.##- 5.815 5,82 DM
####,###.##- -42.17 -42,17 DM
####,##.#######-- 12345.6789 1.23.45,6789 DEM
####,##.#######-- 400.56 4.00,56 DEM
####,##.#######-- 1234567.789 1.23.45.67,789 DEM
####,##.#######-- 5.815 5,815 DEM
####,##.#######-- -42.17 -42,17 DEM
###,00.00- 12345.6789 1.23.45,68 DM
###,00.00- 400.56 04.00,56 DM
###,00.00- 1234567.789 1.23.45.67,79 DM
###,00.00- 5.815 00.05,82 DM
###,00.00- -42.17 -00.42,17 DM





Copyright © Galileo Press GmbH 2003
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.


[Galileo Computing] [Buchkatalog] [Neue Bücher] [Vorschau]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de