1. 概要

このチュートリアルでは、JavaでStringBigDecimalに変換するさまざまな方法について説明します。

2. BigDecimal

BigDecimalは、不変の任意精度の符号付き10進数を表します。 これは2つの部分で構成されています。

  • スケーリングされていない値–任意精度の整数
  • スケール–小数点の右側の桁数を表す32ビット整数

たとえば、 BigDecimal 3.14のスケールなしの値は314で、スケールは2です。

ゼロまたは正の場合、スケールは小数点の右側の桁数です。

負の場合、数値のスケーリングされていない値に10を掛けて、スケールの否定の累乗にします。 したがって、 BigDecimalで表される数値の値は、(スケールなしの値×10-スケール)です。

JavaのBigDecimalクラスは、基本的な算術演算、スケール操作、比較、フォーマット変換、およびハッシュの操作を提供します。

さらに、は、高精度の算術演算、スケールの制御が必要な計算、および動作の丸めにBigDecimalを使用します。 そのような例の1つは、金融取引を含む計算です。

次のいずれかの方法を使用して、JavaでStringBigDecimalに変換できます。

  • BigDecimal(String)コンストラクター
  • BigDecimal.valueOf()メソッド
  • DecimalFormat.parse()メソッド

以下でそれぞれについて説明しましょう。

3. BigDecimal(String)

JavaでStringBigDecimalに変換する最も簡単な方法は、 BigDecimal(String)コンストラクターを使用することです。

BigDecimal bigDecimal = new BigDecimal("123");
assertEquals(new BigDecimal(123), bigDecimal);

4. BigDecimal.valueOf()

BigDecimal.valueOf(double)メソッドを使用して、StringBigDecimalに変換することもできます。

これは2段階のプロセスです。 最初のステップは、StringDoubleに変換することです。 2番目のステップは、DoubleBigDecimalに変換することです。

BigDecimal bigDecimal = BigDecimal.valueOf(Double.valueOf("123.42"));
assertEquals(new BigDecimal(123.42).setScale(2, BigDecimal.ROUND_HALF_UP), bigDecimal);

一部の浮動小数点数は、Double値を使用して正確に表すことができないことに注意する必要があります。 これは、Double型の浮動小数点数のメモリ内表現が原因です。 実際、数値は、入力されたDouble数値に可能な限り近づく有理数で表されます。 その結果、一部の浮動小数点数は不正確になります。

5. DecimalFormat.parse()

値を表すStringの形式がより複雑な場合は、DecimalFormatを使用できます。

たとえば、数値以外の記号を削除せずに、10進数ベースのlong値を変換できます。

BigDecimal bigDecimal = new BigDecimal(10692467440017.111).setScale(3, BigDecimal.ROUND_HALF_UP);

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(',');
symbols.setDecimalSeparator('.');
String pattern = "#,##0.0#";
DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
decimalFormat.setParseBigDecimal(true);

// parse the string value
BigDecimal parsedStringValue = (BigDecimal) decimalFormat.parse("10,692,467,440,017.111");

assertEquals(bigDecimal, parsedStringValue);

DecimalFormat.parseメソッドはNumberを返します。これは、 setParseBigDecimal(true)。を使用してBigDecimal数値に変換されます。

通常、DecimalFormatは必要以上に高度です。 したがって、代わりに new BigDecimal(String)または BigDecimal.valueOf()を優先する必要があります。

6. 無効な変換

Javaは、無効な数値Stringを処理するための一般的な例外を提供します。

特に、 new BigDecimal(String)、BigDecimal.valueOf()、および DecimalFormat.parse は、 null を渡すと、NullPointerExceptionをスローします。

@Test(expected = NullPointerException.class)
public void givenNullString_WhenBigDecimalObjectWithStringParameter_ThenNullPointerExceptionIsThrown() {
    String bigDecimal = null;
    new BigDecimal(bigDecimal);
}

@Test(expected = NullPointerException.class)
public void givenNullString_WhenValueOfDoubleFromString_ThenNullPointerExceptionIsThrown() {
    BigDecimal.valueOf(Double.valueOf(null));
}

@Test(expected = NullPointerException.class)
public void givenNullString_WhenDecimalFormatOfString_ThenNullPointerExceptionIsThrown()
  throws ParseException {
    new DecimalFormat("#").parse(null);
}

同様に、 新しいBigDecimal(String) BigDecimal.valueOf() 投げる NumberFormatException 無効なものを渡すときに解析することはできません BigDecimal (そのような ):

@Test(expected = NumberFormatException.class)
public void givenInalidString_WhenBigDecimalObjectWithStringParameter_ThenNumberFormatExceptionIsThrown() {
    new BigDecimal("&");
}

@Test(expected = NumberFormatException.class)
public void givenInalidString_WhenValueOfDoubleFromString_ThenNumberFormatExceptionIsThrown() {
    BigDecimal.valueOf(Double.valueOf("&"));
}

最後に、無効な String を渡すと、DecimalFormat.parseParseExceptionをスローします。

@Test(expected = ParseException.class)
public void givenInalidString_WhenDecimalFormatOfString_ThenNumberFormatExceptionIsThrown()
  throws ParseException {
    new DecimalFormat("#").parse("&");
}

7. 結論

この記事では、JavaがStringBigDecimal値に変換するための複数のメソッドを提供することを学びました。 一般に、この目的には new BigDecimal(String)メソッドを使用することをお勧めします。

いつものように、この記事で使用されているコードは、GitHubにあります。