2

私のアプリでは、通貨のように見える文字列として BigDecimal オブジェクトをフォーマットする必要があります。

たとえば、次のものが必要です。

  • 45.50 が $45.50 になる
  • 3.444 が $3.44 になる
  • 0.199 が $0.20 になる
  • 6.0 が 6 ドルになる
  • 1200 が $1,200 になる

つまり、最大で小数点以下 2 桁、最小で小数点以下 0 桁 (小数点以下 1 桁ではなく) を表示したいということです。

丸めは通常の方法で、0.0050 は 0.01 に丸められ、0.0049 は 0 に丸められます。

ありがとう!

PS 私の質問は、フォーマットされた BigDecimal 値を印刷する方法とは異なると思いますか? 整数に対して .00 を表示したくないからです。

2 回目の更新:

人々がこれを重複として閉じ、私の質問に答えない答えを指摘したとは信じられません。そのタイプの人は、StackOverflow の有用性を少しずつ減らしていきます。

これが私が思いついた答えですが、見苦しいので、他の人がより良いアイデアを共有することをお勧めします:

public static String getCasualDollarFormattedNumber(BigDecimal number)
{
    String showsTwoDecimalPlaces = NumberFormat.getCurrencyInstance().format(number);
    String zeroes = ".00";
    String lastCharacters = showsTwoDecimalPlaces.substring(Math.max(showsTwoDecimalPlaces.length() - zeroes
            .length(), 0));
    return (lastCharacters.equals(zeroes)) ? showsTwoDecimalPlaces.substring(0, 
            showsTwoDecimalPlaces.length() - zeroes.length()) : showsTwoDecimalPlaces;
}

テスト:

@Test
public void testGetCasualDollarFormattedNumber()
{
    Assert.assertEquals(Replacer.getCasualDollarFormattedNumber(new BigDecimal(45.50)), "$45.50");
    Assert.assertEquals(Replacer.getCasualDollarFormattedNumber(new BigDecimal(3.444)), "$3.44");
    Assert.assertEquals(Replacer.getCasualDollarFormattedNumber(new BigDecimal(0.199)), "$0.20");
    Assert.assertEquals(Replacer.getCasualDollarFormattedNumber(new BigDecimal(6.0)), "$6");
    Assert.assertEquals(Replacer.getCasualDollarFormattedNumber(new BigDecimal(1200)), "$1,200");
}
4

0 に答える 0