1. 개요

이 예제에서는 Java에서 String을 BigDecimal변환하는 다양한 방법을 다룰 것입니다  .

2. 빅데시멀

BigDecimal은 불변의 임의 정밀도 부호 있는 10진수를 나타냅니다 . 두 부분으로 구성됩니다.

  • 스케일링되지 않은 값 – 임의 정밀도 정수
  • 스케일 – 소수점 오른쪽의 자릿수를 나타내는 32비트 정수

예를 들어, BigDecimal 3.14의 스케일되지 않은 값은 314이고 스케일은 2입니다.

0 또는 양수인 경우 스케일은 소수점 오른쪽의 자릿수입니다.

음수인 경우 스케일이 적용되지 않은 숫자 값에 스케일 부정의 거듭제곱에 10을 곱합니다. 따라서 BigDecimal 이 나타내는 숫자의 값은 (Unscaled 값 × 10 -Scale ) 입니다 .

Java의 BigDecimal 클래스 기본 산술, 배율 조작, 비교, 형식 변환 및 해싱을 위한 작업을 제공합니다.

또한 고정밀 산술, 스케일 제어가 필요한 계산 및 반올림 동작에 BigDecimal을 사용합니다 . 이러한 예 중 하나는 금융 거래와 관련된 계산입니다.

아래 방법 중 하나를 사용하여 Java에서 문자열을 BigDecimal변환할 수 있습니다 .

  • BigDecimal(String) 생성자
  • BigDecimal.valueOf() 메서드
  • DecimalFormat.parse() 메서드

아래에서 각각에 대해 논의하겠습니다.

3. BigDecimal(문자열)

Java에서 String을 BigDecimal변환하는 가장 쉬운 방법은 BigDecimal(String) 생성자를 사용하는 것입니다 .

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

4. BigDecimal.valueOf()

BigDecimal.valueOf(double) 메서드를 사용하여  String을 BigDecimal변환할 수도 있습니다  .

이는 2단계 프로세스입니다. 첫 번째 단계는 String을 Double 로 변환하는 것입니다 . 두 번째 단계는 Double을 BigDecimal 로 변환하는 것입니다 .

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

값을 나타내는 문자열의 형식이 더 복잡한 경우  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은 우리가 필요로 하는 것보다 더 고급입니다. 따라서  새 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);
}

유사하게 new BigDecimal(String)BigDecimal.valueOf()는 BigDecimal 로 구문 분석할 수 없는 잘못된 문자열  (예:  & ) 을  전달할 때 NumberFormatException을  발생시킵니다  .

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

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

마지막으로  DecimalFormat.parse는 유효하지 않은 String을  전달할 때  ParseException을  발생시킵니다  .

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

7. 결론

이 기사에서 우리는 Java가 String을 BigDecimal 값 으로 변환하는 여러 가지 방법을 제공한다는 것을 배웠습니다 . 일반적으로 이 목적을 위해 새로운 BigDecimal(String) 메서드를 사용하는 것이 좋습니다  .

항상 그렇듯이 이 기사에서 사용된 코드는 GitHub 에서 찾을 수 있습니다 .

Generic footer banner