![]() |
|
|
4.7.2 Ausgaben formatieren mit MessageFormat
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 implements Cloneable, Serializable |
| 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.
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
| * | 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. |
Listing 4.7 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 22.07.2004 um 19:05:42 ist die Antwort auf alle Fragen wie immer 42.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.8 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.
| Symbol | Bedeutung |
| 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 |
| \u00A4 | Nationales Währungssymbol (i für Deutschland) |
| \u00A4\u00A4 | Internationales Währungssymbol (EUR für Deutschland) |
| X | Alle anderen Zeichen X können ganz normal benutzt werden. |
| ' | Ausmarkieren von speziellen Symbolen im Präfix oder Suffix |
| Beispiel Auswirkungen der Formatanweisungen auf einige Zahlen: |
| Format | Eingabezahl | Ergebnis |
| 0000 | 12 | 0012 |
| 0000 | 12,5 | 0012 |
| 0000 | 1234567 | 1234567 |
| ## | 12 | 12 |
| ## | 12.3456 | 12 |
| ## | 123456 | 123456 |
| .00 | 12.3456 | 12,35 |
| .00 | .3456 | ,35 |
| 0.00 | .789 | 0,79 |
| #.000000 | 12.34 | 12,340000 |
| #,###,### | 12345678.901 | 12.345.679 |
| #.#;(#.#) | 12345678.901 | 12345678,9 |
| #.#;(#.#) | –12345678.901 | (12345678,9) |
| ####,###.## \u00A4 | 12345.6789 | 12.345,68 i |
| ###,00.00 \u00A4\u00A4 | –12345678.9 | –12.34.56.78,90 EUR |
Die Klasse String stellt mit der statischen Funktion format() eine Methode bereit, Zeichenketten nach einer Vorgabe zu formatieren. Das ist ähnlich zu MessageFormat.
final class java.lang. String implements CharSequence, Comparable<String>, Serializable |
| static String format( Locale l, String format, Object... args ) Liefert einen formatieren String, der aus der gewünschten Sprache, dem String und Argumenten hervorgeht. |
| static String format( String format, Object... args ) Liefert einen formatieren String, der aus der dem String und Argumenten hervorgeht. |
Der String format nennt sich Format-String. Er enthält neben auszugebenden Zeichen so genannte Format-Spezifizierer, die dem Formatierer darüber Auskunft geben, wie das Argument formatiert werden soll. %s steht für eine unformatierte Ausgabe eines Strings.
String arg[] = { "Ulli", "Tanja" }; String s = String.format( "Hallo %s. Es gab ein Anruf von %s.", arg ); System.out.println( s ); // Hallo Ulli. Es gab ein Anruf von Tanja.
Die Anzahl der Format-Spezifizierer ist so groß und vielfältig, dass ein Blick in die API-Dokumentation auf jeden Fall nötig ist. Intern werkeln java.util.Formatter (keine java.text.Format-Objekte), die sich auch direkt verwenden lassen; dort ist auch die Dokumentation festgemacht.
Praktischerweise ist das Formatieren und Ausgeben zu einer neuen Funktion printf() in den PrintWriter und PrintStream (das System.out-Objekt ist vom Typ PrintStream) gewandert, so dass sich jetzt auch schreiben lässt:
String arg[] = { "Ulli", "Tanja" }; System.out.printf( "Hallo %s. Es gab ein Anruf von %s.", arg );
Mit der Schreibweise von Java 5 für variable Argumentlisten ist das eigene arg Feld auch nicht mehr nötig, so dass sich der Funktionsaufruf vereinfacht zu:
System.out.printf( "Hallo %s. Es gab ein Anruf von %s.", "Ulli", "Tanja" );
Auch bei printf() ist als erstes Argument eine Locale möglich.
Listing 4.9 PrintfDemo.java
public class PrintfDemo { public static void main( String[] args ) { int i = 123; System.out.printf( "|%d| |%d|\n" , i, -i); // |123| |-123| System.out.printf( "|%5d| |%5d|\n" , i, -i); // | 123| | –123| System.out.printf( "|%-5d| |%-5d|\n" , i, -i); // |123 | |-123 | System.out.printf( "|%+-5d| |%+-5d|\n" , i, -i); // |+123 | |-123 | System.out.printf( "|%05d| |%05d|\n\n", i, -i); // |00123| |-0123| System.out.printf( "|%X| |%x|\n" , 0xabc, 0xabc ); // |ABC| |abc| System.out.printf( "|%08x| |%#x|\n\n" , 0xabc, 0xabc ); // |00000abc| |0xabc| double d = 1234.5678; System.out.printf( "|%f| |%f|\n" , d, -d); // |1234,567800| |-1234,567800| System.out.printf( "|%.2f| |%.2f|\n" , d, -d); // |1234,57| |-1234,57| System.out.printf( "|%10f| |%10f|\n" , d, -d); // |1234,567800| |-1234,567800| System.out.printf( "|%10.2f| |%10.2f|\n" , d, -d); // | 1234,57| | –1234,57| System.out.printf( "|%010.2f| |%010.2f|\n", d, -d); // |0001234,57| |-001234,57| String s = "Monsterbacke"; System.out.printf( "\n|%s|\n" , s ); // |Monsterbacke| System.out.printf( "|%20s|\n" , s ); // | Monsterbacke| System.out.printf( "|%-20s|\n" , s ); // |Monsterbacke | System.out.printf( "|%7s|\n" , s ); // |Monsterbacke| System.out.printf( "|%.7s|\n" , s ); // |Monster| System.out.printf( "|%20.7s|\n" , s ); // | Monster| } }
| << zurück |
Copyright © Galileo Press GmbH 2004
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.