[기본 개념] 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의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 5 | (3.2) Instant, LocalDateTime, ZonedDateTime, TemporalAdjusters (0) | 2021.12.01 |
---|---|
[기본 개념] 5 | (3.1) java.time 패키지, LocalDate, LocalTime (0) | 2021.12.01 |
[기본 개념] 5 | (1.1) Calendar, Date (0) | 2021.11.30 |
[기본 개념] 4 | (2.4) Java.math.BigInteger 클래스, Java.math.BigDecimal 클래스 (0) | 2021.11.30 |
[기본 개념] 4 | (2.3) Java.util.StringToKenizer 클래스 (0) | 2021.11.30 |