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 에서 찾을 수 있습니다 .