[기본 개념] 5 | (2.1) 형식화 클래스

728x90

[기본 개념] 5 | (2.1) 형식화 클래스

1> DecimalFormat

2> SimpleDateFormat

3> ChoiceFormat

4> MessageFormat

1. DecimalFormat

 형식화 클래스 중에서 숫자를 형식화하는 데 사용되는 것이 DecimalFormat이다. 이를 이용하면 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있고 데이터를 숫자로 쉽게 변환도 가능하다.

 

 형식화 클래스에서는 원하는 형식으로 표현, 변환하기 위해 패턴을 정의하는데 자주 사용하는 패턴의 예를 밑에 표에 적었다.

 

기호 의미 패턴 결과 (1234567.89)
0 10진수 (값이 없을 때는 0) 0
0.0
0000000000.0000
1234568
1234567.9
0001234567.8900
# 10진수 #
#.#
##########.####
1234568
1234567.9
1234567.89
. 소수점 #.# 1234567.9
- 음수부호 #.#-
-#.#
1234567.9-
-1234567.9
, 단위 구분자 #,###.##
#,####.##
1,234,567.89
123,4567.89
E 지수기호 #E0
0E0
##E0
00E0
####E0
0000E0
#.#E0
0.0E0
0.000000000E0
00.00000000E0
000.0000000E0
#.#########E0
##.########E0
###.#######E0
.1E7
1E6
1.2E6
12E5
123.5E4
1235E3
1.2E6
1.2E6
1.2345667890E6
12.34567890E5
123.4567890E4
1.23456789E6
1.23456789E6
1.23456789E6
; 패턴구분자 #,###.##+;#,###.##- 1,234,567.89+ (양수일 때)
1,234,567.89-  (음수일 때)
% 퍼센트 #.#% 123456789%
\u2030 퍼밀 (퍼센트 X 10) #.#\u2030 1234567890
\u00A4 통화 \u00A4 #,### \1,234,568
' escape문자 '#'#,333
''#,###
#1,234,568
'1,234,568

 

 DecimalFormat을 사용하는 방법은 원하는 출력 형식의 패턴을 작성하여 인스턴스를 생성한 다음, 출력하고자 하는 문자열로 format메서드를 호출하면 된다.

 

double number = 1234567.89 ;

DecimalFormat df = new DecimalFormat("#.#E0") ;

String result = df.format(number) ;

 

 parse메서드를 통해 기호와 문자가 포함된 문자열을 숫자로 변환할 수 있다. 하지만 ','가 포함된 문자열을 숫자로 변환하지는 못한다.

2. SimpleDateFormat

날짜 데이터를 원하는 형태로 출력할 때 사용하면 된다.

 

기호 의미 보기
G 연대 (BC, AD) AD
y 년도 2006
M 월(1 ~ 12) 10
w 년의 몇 번째 주(1 ~ 53) 50
W 월의 몇 번째 주(1 ~ 5) 4
D 년의 몇 번째 일(1 ~ 366 100
d 월의 몇 번째 일(1 ~ 31) 15
F 월의 몇 번째 요일(1 ~ %) 1
E 요일
a 오전 / 오후 (AM, PM) PM
H 시간(0 ~ 23) 20
k 시간(! ~ 24) 13
K 시간(0 ~ 11) 10
h 시간(1 ~ 12 11
m 분(0 ~ 59) 35
s 초(0 ~ 59) 55
S 천분의 일초(0 ~ 999) 253
z Time zone(General time zone) GMT+9:00
Z Time zone(RFC 822 time zone) +0900
' escape문자(특수문자를 포현하는데 사용) 없음

 

 SimpleDateFormat을 사용하는 방법은 원하는 출력형식의 패턴을 작성하여 인스턴스를 생성한 다음, 출력하고자 하는 Date인스턴스를 가지고 format메서드로 호출하면 된다.

 

Date today = new Date( ) ;

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd:) ;

 

// 오늘의 날짜를 yyyy-MM-dd형태로 변환하여 반환한다.

String result = df.format(today) ;

 

 그리고 Date인스턴스만 format메서드에 사용될 수 있기 때문에 Calendar인스턴스를 Date인스턴스로 변환해야 한다.

3. ChoiceFormat

 ChoiceFormat은 특정 범위에 속하는 값을 문자열로 변환해준다. ChoiceFormat은 연속적, 불연속적인 범위의 값들을 처리할 때 유용하다.

 

예제/ChoiceFormatEx1.java

import java.text.*;

public class ChoiceFormatEx1 {
    public static void main(String[] args) {
        double[] limits = {60, 70, 80, 90};     // 낮은 값부터 큰 값의 순서로 적어야 한다.
        // limits, grades간의 순서와 개수를 맞추어야 한다.
        String[] grades = {"D", "C", "B", "A"};

        int[] scores = {100, 95, 88, 70, 52, 60, 70};

        ChoiceFormat form = new ChoiceFormat(limits, grades);

        for(int i = 0; i < scores.length; i++) {
            System.out.println(scores[i] + ":" + form.format(scores[i]));
        }
    }
}
실행결과

100:A
95:A
88:B
70:C
52:D
60:D
70:C

 

 두 개의 배열이 사용되는데 하나(limits)는 범위의 경계값을 저장하는 데 사용하였고, 또 하나(grades)는 범위에 포함된 값을 치환할 문자열을 저장하는 데 사용되었다.

 

 경계값은 무조건 double형으로 오름차순으로 정렬되어야 하며, 치환될 문자열의 개수는 정의된 범위의 개수와 일치해야 한다. 그렇지 않으면 IllegalArgumentException이 발생한다.

4. MessageFormat

 MessageFormat은 데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다. 데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다.

 

그리고 parse를 이용하여 지정된 양식에서 필요한 데이터만을 손쉽게 추출해 낼 수도 있다. 

 

예제/MessageFormatEx4.java

import java.util.*;
import java.text.*;
import java.io.*;

public class MessageFormatEx4 {
    public static void main(String[] args) {
        String tableName = "CUST_INFO";
        String fileName = "data4.txt";
        String msg = "INSET INTO " + tableName + " VALUES ({0}, {1}, {2}, {3});";
        
        Scanner s = new Scanner(new File(fileName));
        
        String pattern = "{0}, {1}, {2}, {3}";
        MessageFormat mf = new MessageFormat(pattern);
        
        while (s.hasNextLine()) {
            String line = s.nextLine();
            Object[] objs = mf.parse(line);
            System.out.println(MessageFormat.format(msg, objs));
        }
        
        s.close();  // Scanner에서 사용한 파일을 닫아준다.
    }
}
실행결과

INSET INTO CUST_INFO VALUES  ('이자바', '02-123-1234',27,'07-09');
INSET INTO CUST_INFO VALUES  ('김프로', '032-333-1234',33,'10-07');

C:\jdk1.8\work\ch5>type data4.txt
'이자바','02-123-1234',27,'07-09'
'김프로','032-333-1234',33,'10-07'

 

 Scanner를 통해 파일로부터 데이터를 라인별로 읽어서 처리하도록 해서 파일로부터 데이터를 제공받으면 데이터가 변경되어 다시 컴파일하지 않아도 된다.

 

 

 

 

출처 | Java의 정석 (남궁 성)

 
728x90