사용자가 큰 정수(Integer)를 볼 때 콤마로 자릿수가 구분되어 있으면 더 빠르게 숫자를 파악할 수 있게 된다.
또 Double형이나 Float형과 같은 지수형은 데이터가 커지면 데이터에 영문 E가 붙어서 표현된다. (지수 표기법)
이러한 숫자를 프론트에서 사용자를 위하여 큰 수에 콤마를 찍는 방법을 찾아보았다.
1. DecimalFormat을 이용한 방법
DecimalFormat 객체를 생성할 때 "###,###" 을 인자로 넣어 포맷을 설정해준다.
.format 메서드에 인자로 숫자를 넘기면 원하는 포맷대로 숫자를 반환해준다.
int num1 = 2147483647; // –2,147,483,648 ~ 2,147,483,647
log.info("정수 출력 : {}", num1);
DecimalFormat decFormat = new DecimalFormat("###,###");
log.info("decFormat 3자리 콤마 표현 : {}", decFormat.format(num1));
DecimalFormat decFormat2 = new DecimalFormat("####,####");
log.info("decFormat 4자리 콤마 표현 : {}", decFormat2.format(num1));
[결과]
정수 출력 : 2147483647
decFormat 3자리 콤마 표현 : 2,147,483,647
decFormat 4자리 콤마 표현 : 21,4748,3647
2. NumberFormat을 이용한 방법
NumberFormat은 설정된 지역에서 사용하는 표기법으로 문자열을 표현해줍니다.
NumberFormat 객체를 생성할 때, getInstance에 Locale 인자를 전달하면되는데,
Default로 Locale.US 가 설정되어 있어 미국 숫자 표기법을 따릅니다.(3자리 마다 콤마)
NumberFormat numberFormatUS = NumberFormat.getInstance();
log.info("numberFormat 콤마 표현 : {}", numberFormatUS.format(num1));
numberFormat 콤마 표현 : 2,147,483,647
3. 지수를 정수로, 콤마로 표현해보기
BigDecimal 은 Java 언어에서 숫자를 정밀하게 표현할 수 있는 표현식이다.
BigDecimal 형으로 변환하면 소수점이 아주 정밀하게 나온다.
마찬가지로 위에서 사용한 DecimalFormat 과 NumberFormat을 사용하여 콤마형식으로 바꿔주었다.
DecimalFormat 과 NumberFormat의 차이점은 소수점 유무에 있다.
double num2 = 4.5782189464E8; // 1.7E+/-308(15개의 자릿수)
log.info("지수 출력 : {}", num2);
BigDecimal bigDecimal = new BigDecimal(num2);
log.info("지수를 정수로 출력 : {}", bigDecimal);
log.info("decFormat 지수 표현 : {}", decFormat.format(num2));
log.info("numberFormatUS 지수 표현 : {}", numberFormatUS.format(num2));
[결과]
지수 출력 : 4.5782189464E8
지수를 정수로 출력 : 457821894.63999998569488525390625
decFormat 지수 표현 : 457,821,895
numberFormatUS 지수 표현 : 457,821,894.64
4. 타국의 숫자 표현방식 사용하기
이탈리아와 프랑스의 숫자표기법을 출력해봤다.
이탈리아는 점으로 3자리를 나누고 프랑스는 띄어쓰기로 나눈다.
오잉? 신기하다.
NumberFormat numberFormatItaly = NumberFormat.getInstance(Locale.ITALY);
log.info("numberFormatItaly 지수 표현 : {}", numberFormatItaly.format(num2));
NumberFormat numberFormatFrance = NumberFormat.getInstance(Locale.FRANCE);
log.info("numberFormatFrance 지수 표현 : {}", numberFormatFrance.format(num2));
[결과]
numberFormatItaly 지수 표현 : 457.821.894,64
numberFormatFrance 지수 표현 : 457 821 894,64
5. NumberFormat
메서드는 모두 NumberFormat 클래스에 있는 메서드를 사용한다.
알고보니 DecimalFormat 이 NumberFormat을 상속받고있었다.
아래처럼 정수를 넣으면 format(long number) 메서드가,
지수를 넣으면 format(double number) 메서드가 발동한다.
[결론]
정수표현은 편한것을 사용하면 되고,
지수표현할 때는 소수점 이하를 나오게 할거면 NumberFormat을 쓰고,
소수점 이하를 올릴거면 DecimalFormat을 쓰면 될것같다.
Reference
https://jsonobject.tistory.com/466
https://blog.naver.com/PostView.nhn?blogId=windboy83&logNo=220684213153
댓글