본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석7-2 형식화 클래스(DecimalFormat,SimpleDateFormat)

by 이쟝 2022. 1. 8.

형식화 클래스

- java.text패키지의 DecimalFormat(10진수 숫자), SimpleDateFormat(날짜 형식화)

- 형식화: 숫자와 날짜를 원하는 형식으로 출력 (숫자, 날짜 -> 형식 문자열)

- 반대로 형식 문자열에서 숫자와 날짜를 뽑아내는 기능도 가능 (형식 문자열 -> 숫자, 날짜)

 


1) DecimalFormat

- 숫자를 형식화하는 데 사용함

- 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있음

 

- 숫자 -> 일정한 형식의 문자열로 변환

 

 

- DecimalFormat으로 객체 생성 한 뒤에 format( )을 사용

- 10진수 -> 지수표현으로 E10을 나타냄. E6106제곱

 

- 반대로 일정한 형식의 텍스트 데이터(문자열)를 숫자로 쉽게 변환하는 것도 가능

 

 

-> parse()를 사용해서 문자열을 숫자타입의 객체로 변환

-> Integer.parseInt( ), Float.parseFloat( ), Double.parseDouble는 콤마(,)가 포함된 문자열을 숫자로 변환 못함

- Number은 모든 숫자 래퍼클래스의 최고조상!(doubleValue 메서드를 사용해서 숫자(기본형)으로 변환!)


 

DecimalFormat의 패턴에 사용되는 기호

 

DecimalFormat의 패턴에 사용되는 기호(2)

 

-> 패턴을 그대로 갖고 사용 가능!

 

예제) 포맷을 바꿈(문자열 -> 숫자, 숫자 -> 문자열)

 

import java.text.DecimalFormat;
public class Ex10_7 {
	public static void main(String[] args) {
		DecimalFormat df = new DecimalFormat("#,###.##");
		DecimalFormat df2 = new DecimalFormat("#.###E0");
		
		try {
		Number num = df.parse("1,234,567.89");  // parse가 문자열 -> 숫자(Number)
		System.out.print("1,234,567.89 " + "-> " + num);  // 

		// 숫자(Number) -> Double형으로
		double d = num.doubleValue(); // doubleValue()는 저장된 값을 double형의 값으로 변환
		System.out.print(" -> " + df2.format(d)); // d의 값을 format을 사용해서 형식문자열로(지수)
		} catch (Exception e) {}
	}
}

 

더보기

<결과값>

1,234,567.89 -> 1234567.89 -> 1.235E6

 

- Number클래스는 Integer, Double과 같은 숫자를 저장하는 래퍼클래스의 조상이다.(그래서 Double형, Integer형 다 받을 수 있음)

- “1,234,567.89”는 용량이 커서 int, long형을 형변환해도 출력이 안된다…!

- df2.format(num) == df2.format(d)결과값은 같음(형은 다르다! num은 number, d는 double)

 

try-catch구문을 하는 이유(parse 메서드 때문에)

-> parseDecimalFormat의 조상인 NumberFormat에 정의된 메서드이고 메서드의 선언부는

public Number parse(String source) throws ParseException 

-> 예외선언 아니면 try-catch구문을 사용해서 예외처리를 해야함 이 예제에서는 try-catch구문을 사용해서 예외처리를 했다.

 


2) SimpleDateFormat

1) 날짜와 시간을 다양한 형식으로 출력(날짜와 시간 -> 형식화된 문자열)

 

(1) 원하는 출력형식의 패턴을 작성해 SimpleDateForrmat인스턴스를 생성

(2) 출력하고자 하는 Date 인스턴스를 가지고 format(Date 인스턴스 참조변수)메서드를 호출

 

Date today = new Date();  // 오늘 날짜로 객체 생성
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); //mm은 분(시간)

// 오늘 날짜를 yyyy-MM-dd형태로 변환해 반환
String result = sf.format(today);
System.out.println(result);

 

더보기

(1) 오늘 날짜 생성

(2) SimpleDateFormat으로 원하는 출력형식의 패턴을 지정

(3) format( )을 사용해서 원하는 형식으로 result 변수에 넣기

(4) result 변수 출력 -> 지정한 출력형식에 맞게 변환된 문자열 출력!(ex 2020-01-07)

 

패턴에 사용되는 기호

 

 

 


2) 특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있다.(형식화된 문자열 -> 날짜와 시간)

- Parse( ) 메서드 사용

- 문자열 -> parse( ) -> date(날짜) -> format( ) -> 문자열

 

DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd"); 

Date date = df.parse("2015년 11월 23일");  // 문자열을 parse를 사용해 date로 변환
String result2 = df2.format(date);       // date를 format을 사용해 문자열로
System.out.println(result2);

 


예제1) 날자와 시간 표현

 

Date date = new Date(); // 현재의 날짜와 시간
SimpleDateFormat sdf1, sdf2, sdf3, sdf4, sdf5, sdf6, sdf7, sdf8, sdf9;

sdf1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf1.format(date));
sdf2 = new SimpleDateFormat("yy년 MMM dd일 E요일"); // MM월로 써도 가능!
System.out.println(sdf2.format(date));
sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(sdf3.format(date));
sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
System.out.println(sdf4.format(date));
		
sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
System.out.println(sdf5.format(date));
sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
System.out.println(sdf6.format(date));
sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
System.out.println(sdf7.format(date));
sdf8 = new SimpleDateFormat("오늘은 이 달의 W번째 주입니다.");
System.out.println(sdf8.format(date));
sdf9 = new SimpleDateFormat("오늘은 이 달의 W번째 E요일입니다.");
System.out.println(sdf9.format(date));

예제2) parse( )를 사용해서 날짜 데이터의 출력형식을 변환(문자열 -> 날짜인스턴스)

 

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

(1)
public class Ex10_9 {
	public static void main(String[] args) {
		DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일"); // 객체생성
		DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd"); // 객체생성
		
		try { 
			Date date = df.parse("2022년 01월 07일"); // 문자열 "2019년~" -> 날짜 date로
			System.out.println(df2.format(date));    // 날짜를 -> 문자열로 "2022/01/07"
		} catch(Exception e) { }
	}
}

(2)
//try-catch구문을 사용하지 않는다면 이렇게 예외선언해야함!
public class Ex10_9 {
	public static void main(String[] args) throws ParseException {
		
		SimpleDateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
		SimpleDateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
		
		Date date = df.parse("2022년 01월 07일"); // 문자열 "2019년~" -> 날짜 date로
		System.out.println(df2.format(date));    //  날짜를 -> 문자열로 "2022/01/07"
	}
}

예제3) Date인스턴스만 format메서드에 사용할 수 있으므로 Calendar인스턴스를 생성한 뒤 Date인스턴스로 변환하고, 날짜 -> 문자열로 출력!

 

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateFormatEx2 {
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		cal.set(2022,10,6);  // 2022년 11월 6일 - Month는 0 ~ 11의 범위를 가짐
		
		Date date = cal.getTime(); // Calendar를 Date로 변환
		
		SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
		sdf1 = new SimpleDateFormat("yyyy-MM-dd");
		System.out.println(sdf1.format(date));
		sdf2 = new SimpleDateFormat("yy-MM-dd E요일");
		System.out.println(sdf2.format(date));
		sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		System.out.println(sdf3.format(date));
		sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
		System.out.println(sdf4.format(date));
	}
}