java.text 패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.
예를 들어, 입력된 날짜에 대해서 출력할 때 원하는 형식으로 출력하기 위해서는 파싱하는 작업들이 복잡하게 진행된다. (년, 월, 일, 시, 분, 초를 각각 얻어서 정리) 이를 형식화 클래스로 쉽게 해결할 수 있다.
DecimalFormat
숫자를 형식화 하는데 사용된다. 숫자 데이터를 정수, 소수점, 금액 등의 다양한 형식으로 표현할 수 있으며 텍스트 데이터를 숫자로 변환하는 것도 가능하다.
패턴을 정의하고 사용해야 한다. 패턴은 기호를 통해 작성된다.
DecimalFormat은 선언과 함께 패턴을 전달하고 format() 메서드를 이용해 변환된 문자열을 얻게 된다.
double number = 12345.678;
String pattern = "#.#E0";
DecimalFormat df = new DecimalFormat(pattern);
String result = df.format(number);
parse() 메서드를 이요하면 기호와 문자가 포함된 문자열을 숫자로 쉽게 변환할 수 있다.
DecimalFormat df = DecimalFormat("#,###.##");
try {
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); //1234567.89
} catch (Exception e) {}
parse()는 DecimalFormat의 조상인 NumberFormat 클래스에 정의된 메서드로 Number 타입을 반환한다. 예외처리가 되어 있기 때문에 try-catch로 감싸서 사용한다.
SimpleDateFormat
날짜를 다루는 형식화 클래스이다. 패턴에 사용되는 기호는 레퍼런스에 정의되어 있다.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/SimpleDateFormat.html
간단하게 자주 사용하는 y(년), M(월), d(일), H(시), m(분), s(초) 정도만 알아두고 나머지는 레퍼런스를 참고하면 좋을 것 같다.
SimpleDateFormat도 선언과 함께 패턴을 전달하고 format() 메서드를 통해 패턴에 맞게 변환한다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String result = df.format(today); // 2021-05-18
Date 클래스로 생성된 인스턴스만 format() 메서드에 사용될 수 있다.
Calendar로 생성된 경우 Date 인스턴스로 변환하여 사용해야 한다.
Calendar cal = Calendar.getInstance();
cal.setTime(2015, 7, 15);
Date day = cal.getTime(); // Calendar를 Date로 변환한다.
parse() 메서드를 사용하면 문자열로 전달된 파라미터를 Date 인스턴스로 변환시켜준다.
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
try {
Date d = df.parse("2015년 11월 19일");
df2.format(d);
} catch (Exception e) {}
df 형식에 맞는 날짜 문자열을 parse()가 파라미터로 받아 Date 인스턴스를 생성했다. 그리고 df2의 format() 메서드를 이용해 변환한다. 지정된 형식과 맞지 않는 경우 parse() 메서드가 예외를 발생시키기 때문에 예외처리가 필요하다.
ChoiceFormat
특정 범위에 속하는 값을 문자열로 변환해준다. if문이나 switch문으로 설정할 수 있으나 부족한 부분이 있다.
ChoiceFormat을 사용하면 간단하고 직관적으로 만들 수 있다.
double[] limits = {60, 70, 80, 90}; //오름차순이어야 한다.
String[] grades = {"D", "C", "B", "A"}; // limits와 grades의 순서와 개수가 맞아야 한다.
int[] scores = {100, 95, 88, 70, 52, 60, 70};
ChoiceFormat cf = new ChoiceFormat(limits, grades);
for (int i = 0; i < scores.length; i++) {
System.out.println(cf.format(scores[i]));
// A A B C D D C
}
ChocieFormat에 파라미터로 기준 값을 가진 배열과 이에 따른 결과를 가진 배열을 전달한다. format() 메서드를 이용해 전달되는 값이 어느 범위에 속하는지에 따라 결과를 반환한다.
배열을 통해 전달하지 않고 패턴을 통해서도 기준과 결과를 정할 수 있다.
String pattern = "60#D|70#C|80<B|90#A";
ChoiceFormat cf = new ChoiceFormat(pattern);
패턴에 따라 60~69는 D, 70~80은 C, 81~89 B, 90~ A로 정해진다. ' | '을 통해 구분하고, #, <을 통해 경계 값의 포함 여부를 지정한다. (#은 포함, <은 포함하지 않음)
MessageFormat
데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다. 설명보다 예시로 파악하는 것이 좋다.
String msg = "Name: {0}, Tel: {1}, Age: {2}, Birthday: {3}";
Object[] args = {
"kim", "010-1234-5678", "22", "0920"
};
String result = MessageFormat.format(msg, args);
// Name: kim, Tel: 010-1234-5678, Age: 22, Birthday: 0920
출력될 메시지에 작성된 '{n}' 부분이 데이터가 출력될 자리로 순차적이지 않아도 되고, 여려번 반복해서 사용해도 된다.
객체 배열로 전달하기 때문에, 문자열이 아닌 다른 형식을 전달할 수도 있다.
그리고 2차원 배열을 선언하고 한 행씩 전달해서 반복문을 통해 여러 데이터를 한번에 처리할 수 있다.
Object[][] args = {
{"kim", "010-1234-1234", "22", "0920"},
{"park", "010-2345-2345", "23", "1022"}
};
for (int i = 0; i < args.length; i++) {
String result = MessageFormat.format(msg, args[i]);
}
parse() 메서드를 사용해 문자열에서 객체 배열로 데이터를 가져올 수 있다.
String data = "Name: kim, Tel: 010-1234-1234, Age: 22, Birth: 0920";
String pattern = "Name: {0}, Tel: {1}, Age: {2}, Birth: {3}";
MessageFormat mf = new MessageFormat(pattern);
Object[] obj = mf.parse(data);
// obj = {"kim", "010-1234-1234", "22", "0920"};
'Java' 카테고리의 다른 글
[Java] ArrayList (0) | 2021.05.21 |
---|---|
[Java] java.time 패키지 (0) | 2021.05.20 |
[Java] 날짜와 시간 (Calendar, Date) (0) | 2021.05.18 |
[Java] String 클래스 (0) | 2021.05.10 |
[Java] 생성자 (Constructor) (0) | 2021.05.07 |