1

大量のドキュメントを生成するシステムがあります。その内容は ResourceBundles で定義されています。

MessageFormat が通貨値を出力する方法をカスタマイズしたいと考えています。通貨を端数なしで表示したい場合があります (常にではありません)。

これは期待どおりに動作するはずですが、そうではありません:

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"))));

残念ながら、次のように出力されます。

US$1,00

リソースバンドルの「プロパティ」ファイルで通貨のカスタムフォーマットを使用している人はいますか?

システム全体で変更したくありません。

ところで、これは java.text.MessageFormat で問題なく動作します。

4

1 に答える 1

1

わかりました、あなたの質問をもう一度読みました。セントの部分を切り詰めたい理由がよくわかりません(米国では、韓国や日本ではセントをまったく使用しないので理にかなっています)。
とにかく、セントの部分だけを切り取るのは良い考えではないと思いますが、やりたい場合は、 NumberFormat をsetMaximumIntegerDigits(int)で使用するのと同じくらい簡単です。

ところで、リソースバンドルを使用してNumberFormatを使用できない理由はまだわかりません。でフォーマッターを呼び出すことができますMessageFormat.format()

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

予想どおり、次のように出力されます。

いくらか: $1.

通貨を保持する必要がある場合は、setCurrency(Currency)ローカル形式を保持することでメソッドを試すことをお勧めします。とにかく、内部化タグでこの質問をしています。


編集: MessageFormat 機能に関する情報を含める

ロケールにカスタム通貨形式を使用する必要がある場合は、実際には MessageFormat クラスをインスタンス化する必要があります (通常の静的MessageFormat.format(String, Object...)は、デフォルトのロケールを使用するため、Web アプリケーションでは機能しません - Locale.getDefault(Locale.Category.FORMAT)Java 7 では、必要に応じてサーバーのロケール)。

したがって、本当に必要なのは、次のようなヘルパー メソッドを作成することです (申し訳ありませんが、おまけはありません) (メモリ不足です、申し訳ありません)。

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();
}

パフォーマンス上の理由から、StringBuffer を一度作成してから常にクリーンアップすることを考えるかもしれませんが、最適化は自分自身に任せます。
また、パターンを少し変更する必要があります。その理由をすぐに説明します。

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

金額と通貨記号を渡し、記号を配置する場所とロケールの値をフォーマットする方法を翻訳者に任せる必要があります (プロパティ ファイルにコメントを追加することを忘れないでください!)。

于 2012-04-15T19:09:17.263 に答える