JAVA

[Java] Format Class(형식화 클래스)

SangRok Jung 2022. 7. 15. 17:59
반응형



 

 

 

Format Class


jave.text package에 포함되어 있다.

Number, Date, text Data를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.

"123"과 같은 문자열을 Integer.parseInt()를 사용하여 123이라는 숫자로 변환하는 것과 같은 일이 가능하다는것을 의미한다.

형식화된 Data의 패턴만 정의하면 복잡한 문자열에서도 substring()을 사용하지 않고도 쉽게 원하는 값을 얻어 낼 수 있다.

 

 

 

 

 

 

 

 

DecimalFormat


Format class중에 Number를 형식화 하는데 사용한다.

number data를 정수, 부동소수점, 금액 등 다양한 형식으로 표현 할 수 있으며 일정한 형식의 text data를 숫자로 쉽게 변환하는 것도 가능하다.

 

 

 

기호 의미 패던 결과값(1234567.89)
0 10진수 (값이 없을 때는0) 0
0.0
000000000.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.234567890E6
12.34567890E6
123.4567890E6
1.23456789E6
1.23456789E6
1.23456789E6
; 패턴구분자 #.###.##+;#.###.##- 1.234.567.89+ (양수일 때)
1.234.567.89- (음수일 때)
% 퍼센트 #.#% 123456789%
\u2030 퍼밀 (퍼센트 * 10) #.#\u2030 1234567890
\u00A4 통화 \u00A4 #.### ₩ 1.234.568
' escape문자 '#'#.###
"#.###
#1,234,568
'1,234,568

 

 

 

        // 숫자, 날짜 => 형식 문자열의 예
        double number = 123456.789;
        DecimalFormat df = new DecimalFormat("#.#E0");
        String result = df.format(number);


        // 형식 문자열 => 숫자, 날짜
        DecimalFormat df2 = new DecimalFormat("#,###.##");
        Number num = df2.parse("1,234,567,89");
        double d = num.doubleValue();
        //Number는 모든 숫자 Class의 최고 조상.
        
        // * Integer.parseInt()는 ,가 포함된 문자열을 숫자로 변환 못한다.
        // * Float.parseFloat()도 마찬가지.

 

 

 

 

 

 

 

 

 

 

 

패턴을 이용하여 숫자와 문자로 변환하는 예제


import java.text.*;

public class Ex {
    public static void main(String[] args) {
        DecimalFormat df = new DecimalFormat("#,###.##");
        DecimalFormat df2 = new DecimalFormat("#.###E0");

        try{
            Number num = df.parse("1,234,567.89");
            System.out.print("1,234,567.89" + " |문자 => 숫자| ");

            double d = num.doubleValue(); // d=1234567.89
            System.out.print(d + " |숫자  => 문자| ");

            System.out.println(df2.format(num));
        }
        catch(Exception e){

        }
        
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SimpleDateFormat


Date Data를 원하는 형태로 다양하게 출력할 수 있다.

 

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

* 보다 자세한 내용은 https://docs.oracle.com/javase/10/docs/api/java/text/SimpleDateFormat.html

 

 

 

 

 

 

 

 

 

예제


▶ 다양한 형식의 날짜 출력.

public class Ex {
    public static void main(String[] args) {
        Date today = new Date(); // 현재의 시간과 날짜를 저장한다.

        SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
        SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;

        sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        sdf2 = new SimpleDateFormat("''yy년 MMM dd일 E요일");
        sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:SSS");
        sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
        
        sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날 입니다.");
        sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날 입니다.");
        sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
        sdf8 = new SimpleDateFormat("오늘은 올 해의 W번째 주입니다.");
        sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일 입니다.");

        System.out.println(sdf1.format(today));
        System.out.println(sdf2.format(today));
        System.out.println(sdf3.format(today));
        System.out.println(sdf4.format(today));
        System.out.println(sdf5.format(today));
        System.out.println(sdf6.format(today));
        System.out.println(sdf7.format(today));
        System.out.println(sdf8.format(today));
        System.out.println(sdf9.format(today));

        // 2022-07-15
        // '22년 7월 15일 금요일
        // 2022-07-15 17:33:475
        // 2022-07-15 17:33:35 오후
        // 오늘은 올 해의 196번째 날 입니다.
        // 오늘은 이 달의 15번째 날 입니다.
        // 오늘은 올 해의 29번째 주입니다.
        // 오늘은 올 해의 3번째 주입니다.
        // 오늘은 이 달의 3번째 금요일 입니다.
    }

 

 

 

 

 

 

 

 

 

▶ parse(String source)를 사용하여 date data의 출력형식을 변환하는 예제.

 

Inerger의 parseInt()가 문자열을 정수로 변환하듯 SimpleDate Format의 parse()는 문자열 source를 date data instance로 변환하기 때문에 유용하게 쓰일 수 있다.

 

public class Ex {
    public static void main(String[] args) {
        DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
        DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

        try{
            Date d = df.parse("2019년 11월 23일");
                // 문자열에서 날짜
            System.out.println(df2.format(d));
                // 날짜에서 문자열
        }
        catch (Exception e){
        }
    }
}

 

 

 

 

 

 

 

▶ 화면으로부터 날짜를 입력받아 계산결과를 출력하는 예제.

 

while과 try-catch문을 이용하여 사용자가 올바른 형식으로 입력할 때 까지 반복해서 입력받도록 하였다.

지정된 패턴으로 입력되지 않은 경우. parse method를 호출하는 부분에서 예외가 발생하기 때문에 while문을 벗어나지 못한다.

 

public class Ex {
    public static void main(String[] args) {
        String pattern = "yyyy/MM/dd";
        DateFormat df = new SimpleDateFormat(pattern);
        Scanner s = new Scanner(System.in);

        Date inDate = null;
        System.out.println("날짜를" + pattern + "형태로 입력하세요.(ex : 2019/12/31");

        while(s.hasNext()) {
            try{
                inDate = df.parse(s.nextLine());
                break;
            }
            catch(ParseException e){
                System.out.println("날짜를" + pattern + "의 형태로 다시 입력하세요.");
            }
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(inDate);
        Calendar today = Calendar.getInstance();
        long day = (cal.getTimeInMillis() - today.getTimeInMillis()/(60*60*1000));

        System.out.println("입력하신 날짜는 현재와" + day + "시간 차이가 있습니다.");
    }
}
반응형

'JAVA' 카테고리의 다른 글

[Java] Collections Framework  (0) 2022.07.21
[Java] Calendar Exercise (예제)  (0) 2022.07.19
[Java] Calendar Class  (0) 2022.07.14
[Java] Collections Framework (총정리)  (0) 2022.07.05
[Java] Method of Math  (0) 2022.06.29