2017-08-04 8 views
1

Monetary APIを使用してJavaのMoney値をフォーマットしています。 MonetaryAmountFormatを使用して値をフォーマットすると、2回以上の丸めで誤った値が返されます。例を言ってみましょう:上記の例のMonetary APIを使用してフォーマットされた2つ以上の精度丸めJava

private static final MonetaryAmountFormat MONETARY_AMOUNT_FORMAT = MonetaryFormats.getAmountFormat(Locale.getDefault()); 
    MonetaryAmount amount = Monetary.getDefaultAmountFactory() 
      .setCurrency(currencyUnit).setNumber(Double.valueOf(value.toString())).create().with(rounding); 
    value = MONETARY_AMOUNT_FORMAT.format(amount); 

出力:

Rounding = 2, amount = 12323.45, value =12,323.45 //OK 
Rounding = 3, amount = 12323.45334, value =12,323.45 //Wrong, it should convert it 12323.453 

フォーマットで2つ以上の丸めを達成するためにどのような方法がありますか?

+0

あなたは、あなたのローカル設定に縛らLocale.getDefault()を使用しました。独自のカスタムフォーマットを作成してみてください。 –

+0

ここで例を見てください:http://www.programcreek.com/java-api-examples/index.php?api=javax.money.format.MonetaryFormats。あなたは私が見ている 'パターン' –

+0

を変更することができます。整数値としてのみ丸めます。私はパターンを適用したくありません。インプラントごとに、私は2,3などの設定から来る丸めだけを持っています。私はデフォルトのローカルパターンを使いたい。精度の変更のみが必要です。 – iMBMT

答えて

1

あなたはパターンを変更することで、小数点以下の数を変更することができます。

@Test 
public void formatMoneyCustom2() throws Exception { 
    final MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
      AmountFormatQueryBuilder.of(Locale.US) 
        .set(CurrencyStyle.SYMBOL) 
        .set("pattern", "#,##0.00### ¤") 
        .build() 
    ); 
    final String formatted = format.format(MoneyImpl.ofCents(123456, "USD")); 
    assertThat(formatted).isEqualTo("1,234.56 $"); 
} 
+0

+1ありがとうございます。私は規模の価値しか持っていないので、私の場合はうまくいかない。毎回使用するデフォルトのフォーマットが必要です。精密な部分だけが注意を払った。それ以外の方法はありますか?カスタマイズしたものを試してみましょう – iMBMT

+0

デフォルトのフォーマットである2.d.pにフォーマットされているので、それはあなたの丸めを無効にします。上記の例のように、フォーマットに小数点以下桁数を指定してから、後で丸めを適用することができます。 –

+0

は、丸めに基づいて手動でパターンを作成することを意味します。それは良いアプローチではないようです。他に何かありますか – iMBMT

関連する問題