본문 바로가기

Backend/Java

[JAVA] 숫자 출력 형식 지정 DecimalFormat 클래스

 


숫자 출력 형식을 지정하는 DecimalFormat 클래스


 

 

1. DecimalFormat 클래스


DecimalFormat 클래스는 10진수 관련 포맷을 설정한다. 이를 이용해 다양한 숫자 형식을 편하게 출력할 수 있다.

DecimalFormat df = new DecimalFormat(); // 10진수 관련 포맷
// 직접 형식 지정
double number = 2123.456789;
System.out.println("2123.456789 소수점 세자리 -> " + (int)(number*1000)/1000.0); // 버림

// DecimalFormat 을 이용한 형식 지정
df = new DecimalFormat("#,###.###");
System.out.println("2123.456789 소수점 세자리 -> " + df.format(number)); // 반올림

 

 

 

2. 숫자 지정 형식


형식 의미 예시
0.00 소수점 두자리까지 출력 123.456 → 123.45
0,000 천단위 구분 기호 123456 → 123,456
89.0 → 0,089
#,### 무효의 0을 표시하지 않는 # 123456789.0 → 123,456,789
89.0 → 89
#,### 원 '원'  단위 (또는 기호) 추가  1234567.0 → 1,234,567 원
#.#% % 표시 (백분율) 0.8539 → 85.4%

 

위와 같은 형식들을 DecimalFormat() 의 (괄호)안에 "큰 따옴표"로 묶어 형식을 지정할 수 있다.

 

 

DecimalFormat df = new DecimalFormat(); // 10진수 관련 포맷
double number = 123123.123456;

System.out.println(number); // 123123.123456
System.out.println(df.format(number)); // 123,123.123

df = new DecimalFormat("0.00"); // 소수점 두자리
System.out.println(df.format(number)); // 123123.12

df = new DecimalFormat("00000000.00000000"); // 실수 8자리, 소수점 8자리
System.out.println(df.format(number)); // 00123123.12345600

 

이전에 다뤘던 SimpleDateFormat 과 사용 방식은 유사하다.

 

그런데 하나 특이한 경우가 숫자보다 지정한 자리수가 더 많을 때 발생한다. 마지막 예시처럼 자리를 채우기 위해 0이 붙는 경우다. 이때 붙는 양식문자 0에 대해 조금 더 자세히 살펴보자.

 

 

 

3. 양식문자 0


양식문자 0 이란, 표시할 숫자들의 자리 표현을 뜻한다.

 

양식문자는 아래와 같은 규칙을 따른다.

  1. 표시할 숫자가 많으나 0의 개수가 모자르면, 필요한 만큼 0의 개수를 추가 적용한다
  2. 숫자 자리수보다 0의 개수가 많으면, 많은 만큼 0으로 채워서 표시한다
  3. 소수점 아래에 대해서는 표시할 숫자가 많으나 0의 개수가 모자르면, 0의 개수만큼만 소수점 아래 자리수를 표시한다
  4. 소수점 자리수보다 0의 개수가 많으면, 많은 만큼 0으로 채워서 표시한다

 

자세한 예시로 살펴보자.

DecimalFormat df = new DecimalFormat();
double number = 12345.7894;

df = new DecimalFormat("0.00");
System.out.println("0.00 : " + number + " --> " + df.format(number));

df = new DecimalFormat("0.000000");
System.out.println("0.000000 : " + number + " --> " + df.format(number));

 

 

 

DecimalFormat df = new DecimalFormat();
double number = 1234567.0;

// "," 천단위 구분기호
df = new DecimalFormat("0,000");
System.out.println("0,000 : " + number + " --> " + df.format(number));

number = 89.0;
System.out.println("0,000 : " + number + " --> " + df.format(number));

 

 

 

4. 0을 표시하지 않는 #


형식에 양식문자 0 대신 #을 넣게되면, 0을 사용하지 않게 된다.

DecimalFormat df = new DecimalFormat();
double number = 1234567.0;

// 무효의 0을 표시하지 않는 #을 0 대신 사용
df = new DecimalFormat("#,###");
System.out.println("#,### : " + number + " --> " + df.format(number));

number = 1234589.0;
System.out.println("#,### : " + number + " --> " + df.format(number));

 

 

 

형식에 단위나 기호를 붙여서 표시할 수도 있다.

DecimalFormat df = new DecimalFormat();
number = 1234589.0;

// 단위 또는 기호 등이 추가돼서 표시
df = new DecimalFormat("#,### 원");
System.out.println("#,### 원 : " + number + " --> " + df.format(number));
df = new DecimalFormat("\\ #,###");
System.out.println("\\ #.### : " + number + " --> " + df.format(number));