{"id":2232,"date":"2013-09-03T21:03:16","date_gmt":"2013-09-03T19:03:16","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2232"},"modified":"2013-09-03T21:03:16","modified_gmt":"2013-09-03T19:03:16","slug":"ausgaben-mit-messageformat-formatieren","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/ausgaben-mit-messageformat-formatieren\/","title":{"rendered":"Ausgaben mit MessageFormat formatieren"},"content":{"rendered":"<p>MessageFormat ist eine konkrete Unterklasse der abstrakten Klasse Format und dient dazu, Nachrichten sprachunabh\u00e4ngig zu erzeugen. Das hei\u00dft, die tats\u00e4chliche sprachabh\u00e4ngige Ausgabe wird so weit wie m\u00f6glich 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\u00e4ger) werden zur Laufzeit eingesetzt. Dabei enthalten die Formatierungsanweisungen Platzhalter f\u00fcr diese Objekte. In der Regel werden Daten (die Argumente) erst zur Laufzeit ermittelt, wie etwa die Zeilennummer einer Fehlerstelle in einer Eingabedatei.<\/p>\n<p><b>Beispiel<\/b> 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.<\/p>\n<pre>Object[] testArgs = { 31415L, &quot;SchnelleLotte&quot; };\nMessageFormat form = new MessageFormat(\n  &quot;Anzahl Dateien auf der Festplatte \\&quot;{1}\\&quot;: {0}.&quot; );\nSystem.out.println( form.format(testArgs) );<\/pre>\n<p>Die Ausgabe mit unterschiedlichen testArgs ist:<\/p>\n<pre>Anzahl Dateien auf der Festplatte &quot;SchnelleLotte&quot;: 0.\nAnzahl Dateien auf der Festplatte &quot;SchnelleLotte&quot;: 1.\nAnzahl Dateien auf der Festplatte &quot;SchnelleLotte&quot;: 31,415.<\/pre>\n<p>Die Argumente aus dem Array werden \u00fcber die Platzhalter wie {0} in die Nachricht eingef\u00fcgt. Die Nummern entsprechen der Reihenfolge der Argumente im Array. Eintr\u00e4ge im Array k\u00f6nnen ungenutzt bleiben. Fehlt allerdings das einem Platzhalter entsprechende Element im Feld, so wird eine ParseException ausgel\u00f6st.<\/p>\n<p><b>class java.text.MessageFormat extends Format<\/b><\/p>\n<ul>\n<li>MessageFormat( String pattern ). Erzeugt ein MessageFormat-Objekt mit dem angegebenen Pattern. <\/li>\n<\/ul>\n<p>Gegen\u00fcber anderen Format-Klassen zeigt die Klasse MessageFormat eine Besonderheit beim Erzeugen: MessageFormat-Objekte werden \u00fcber ihren Konstruktor erzeugt und nicht \u00fcber getInstance(). Der Grund ist, dass \u00fcblicherweise die Erzeugungsfunktionen \u2013 damit sind die getInstance()-Varianten gemeint \u2013 eine komplexe Initialisierung durchlaufen, die die landesspezifischen Einstellungen festlegen. MessageFormat ist aber an keine bestimmte Sprache gebunden und ben\u00f6tigt folglich auch keine Initialisierung.<\/p>\n<h4><font style=\"font-weight: bold\">Bildungsgesetz f\u00fcr Message-Formate<\/font><\/h4>\n<p>Die Zeichenkette f\u00fcr MessageFormat enth\u00e4lt die Format-Elemente, die in geschweiften Klammern gesetzt sind. Steht dort nur der Index \u2013 wie {0} \u2013, ist das der einfachste Fall. Die API-Dokumentation von MessageFormat zeigt jedoch, dass die Angaben auch pr\u00e4ziser ausfallen k\u00f6nnen:<\/p>\n<ul>\n<li><b>{ ArgumentIndex, FormatType }<\/b>: Element wird nach dem angegebenen Format-Typ number, date, time oder choice formatiert. MessageFormat besorgt sich zum Beispiel im Fall vom Format-Typ number \u00fcber NumberFormat.getInstance(getLocale()) einen passenden Formatierer. <\/li>\n<li><b>{ ArgumentIndex, FormatType, FormatStyle }<\/b>: Neben dem Format-Typ l\u00e4sst sich der Stil festlegen. Vordefiniert sind short, medium, long, full, integer, currency und percent. Ein eigener Formatierungsstil l\u00e4sst sich auch angeben, der aber zur Unterscheidung in einfachen Hochkommata eingeschlossen werden muss. <\/li>\n<\/ul>\n<p>Abschlie\u00dfend sei ein Beispiel mit MessageFormat gegeben, das das gleiche Argument unterschiedlich formatiert:<\/p>\n<pre>Object[] arguments = {\n  new Date(),\n  &quot;die Antwort auf alle Fragen&quot;,\n  42 \/\/ Integer object\n};\nString result = MessageFormat.format(\n  &quot;Am {0,date} um {0,time} ist {1} wie immer {2,number,integer}.&quot;, arguments );\nSystem.out.println( result );<\/pre>\n<p>Dies erzeugt die Ausgabe:<\/p>\n<pre>Am 21.08.2007 um 15:43:56 ist die Antwort auf alle Fragen wie immer 42.<\/pre>\n<p><b>Hinweis<\/b> Bei den geschweiften Klammern besteht Verwechslungsgefahr zwischen Message-Platzhalter und 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 \\'{&#8218; ersetzt werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MessageFormat ist eine konkrete Unterklasse der abstrakten Klasse Format und dient dazu, Nachrichten sprachunabh\u00e4ngig zu erzeugen. Das hei\u00dft, die tats\u00e4chliche sprachabh\u00e4ngige Ausgabe wird so weit wie m\u00f6glich 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-2232","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2232"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2232\/revisions"}],"predecessor-version":[{"id":2233,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2232\/revisions\/2233"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}