2012-04-13 13 views
1

Ich habe ein System, das viele Dokumente generiert. Sein Inhalt ist in ResourceBundles definiert.So passen Sie die Währungsformatierung in MessageFormat in ICU4J an

Ich möchte anpassen, wie MessageFormat Währungswerte druckt. Manchmal möchte ich, dass Währungen ohne Nachkommastellen angezeigt werden (aber nicht immer).

Dies sollte wie erwartet funktionieren, aber es ist nicht:

System.err.println(
    com.ibm.icu.text.MessageFormat.format(
     "{0,number,\u00A4#}", 
     new com.ibm.icu.util.CurrencyAmount(1, 
     com.ibm.icu.util.Currency.getInstance("USD")))); 

Leider ist es ausdruckt:

US$1,00 

Hat jemand von Ihnen, benutzerdefinierte Formate für Währung in Ressourcenbündel ‚Eigenschaften‘ Dateien verwenden ?

Ich möchte es nicht systemweit ändern.

Und das funktioniert übrigens mit java.text.MessageFormat.

+0

Gründe, warum Sie die JDK-Version dann nicht verwenden können? Und nebenbei bemerkt: Gibt es einen bestimmten Grund, warum Sie 'NumberFormat.getCurrencyInstance (locale)' nicht verwenden können? –

+0

Es gibt zwei Gründe, warum ich ICU verwenden möchte. Erstens muss unsere Anwendung bestimmte Währungen in verschiedenen Gebietsschemata drucken, was in der JDK-Version nicht möglich ist (die Währung muss unabhängig vom aktuellen Gebietsschema sein). Zweitens gibt es auf der ICU eine Rechtschreibformatierung, die auch in verschiedenen Gebietsschemata gedruckt werden muss. Und ich möchte 'NumberFormat.getCurrencyInstance (locale)' nicht verwenden, da alle meine Nachrichten in ResourceBundles sind. – Marti

Antwort

1

OK, ich habe deine Frage noch einmal gelesen. Ich weiß nicht wirklich, warum Sie den Cent-Teil zerhacken wollen (in den USA macht das in Korea oder Japan Sinn, weil sie sie überhaupt nicht benutzen).
Wie auch immer, ich denke nicht, dass es eine gute Idee ist, Cent-Teil nur zu schneiden, aber wenn Sie es tun möchten, ist es so einfach wie mit NumberFormat mit setMaximumIntegerDigits(int).

BTW, ich weiß immer noch nicht, ich weiß, warum durch die Verwendung von Ressourcen-Bundles können Sie NumberFormat nicht verwenden. Sie können immer noch Formatierer in MessageFormat.format() nennen:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(Locale.US); 
currencyFormatter.setMaximumFractionDigits(0); 
System.err.println(MessageFormat.format("Some amount: {0}.", 
     currencyFormatter.format(1d))); 

Vorhersagbar es ausdruckt:

Eine gewisse Menge: 1 $.

Wenn Sie die Währung zu halten brauchen, würde ich vorschlagen, mit setCurrency(Currency) Methode spielen, indem sie lokales Format behalten - Sie diese Frage in Internalisierung Tag fragt sowieso.


Edit: Einschließlich Informationen über Message Fähigkeiten

Wenn Sie benutzerdefinierte Währungsformate für eine Locale verwenden müssen, müssen Sie tatsächlich Message Klasse (regelmäßige statische MessageFormat.format(String, Object...) wird nicht funktionieren in Web-Anwendungen instanziiert Dafür verwendet es das Standard-Gebietsschema - Locale.getDefault(Locale.Category.FORMAT) in Java 7 - Server-Gebietsschema, wenn Sie bevorzugen.

Also, was Sie wirklich wollen, ist eine Hilfsmethode zu schreiben (sorry, kein Bonus), die (aus dem Speicher, sorry) in etwa so aussehen:

public static String format(String pattern, Locale locale, Object... args) { 
    final String emptyPattern = ""; 
    final FieldPosition zero = new FieldPosition(0); 
    MessageFormat fmt = new MessageFormat(emptyPattern, locale); 
    StringBuffer buf = new StringBuffer(); // I just love it... 

    fmt.applyPattern(pattern); 
    fmt.format(args, buf, zero); 

    return buf.toString(); 
} 

Aus Performance-Gründen, könnte man denken, Ich erstelle StringBuffer einmal und säubere es dann immer wieder, aber ich überlasse Optimierungen dir selbst.
Sie würden auch einen Bitmuster ändern müssen, und ich werde in einem Moment erklären, warum:

String pattern = "{1}{0,number,\u00A4#}"; 

Sie müßten den Betrag und das Währungssymbol und links Übersetzer weitergeben, wo das Symbol platzieren und wie man Formatwert für ein Gebietsschema (Vergessen Sie nicht, der Eigenschaftendatei Kommentare hinzuzufügen!).

+0

Danke für Ihre schnelle Hilfe. Ich habe mein Problem nicht genug beschrieben. In unserem System erzeugen wir viele Dokumente, die formellen Richtlinien entsprechen müssen. Einige von Beträgen müssen nichts als den Cents-Teil haben (z. B. für Polen ist ein formaler Weg, zwei Zahlen in den Cent-Teil zu addieren, aber wir müssen sie abschneiden), aber in anderen Situationen halten wir an einer üblichen Art der Geldpräsentation fest. Es ist also keine Option, Bruchzahlen auf einem systemweiten Formatierer zu setzen. Und das Erstellen von verschiedenen Formatierern in Java für einzelne Nachrichten, die aus ResourceBundles stammen, wird schmerzhaft sein. – Marti

+0

Lassen Sie mich erklären, warum Ihre Lösung nicht zuerst funktioniert: [http://icu-project.org/apiref/icu4j/com/ibm/icu/util/CurrencyAmount.html] CurrencyAmount leitet sich nicht von Number ab, also plain toString () wird während der Formatierung aufgerufen. Es wird nicht für dich funktionieren. Jetzt schau dir meine Bearbeitung an :) –

Verwandte Themen