자바

Format 클래스

정수 세 자리마다 쉼표(,) 를 넣고 싶대면 어떻게 해야 할까? 정수를 문자열로 변환한 다음, 세 자리씩 끊어서 쉼표를 넣을 수 있을 것이다. 하지만 이 작업은 매우 귀찮은 작업이고 코드가 지저분해진다. 다른 예로 많은 수의 점수를 리스트화해서 출력할 때 소수점 한 자리로 일정하게 맞추어 출력하려면 어떻게 해야 할까? 각 점수에 10을 곱해서 정수화하고, 다시 10.0 으로 나누어 소수점 한 자리로 만들어야 한다. 이 작업 역시 지저분하게 보인다. 날자 역시 원하는 문자열로 출력하기 위해서는 Calendar로부터 년, 월, 일, 시, 분 , 초를 얻어 원하는 문자열로 조합하는 과정을 거쳐야 한다. 자바에서는 이러한 문제들을 쉽게 해결할 수 있는 방법을 제공하는데, 이것이 형식 클래스이다. 형식 클래스는 java.text 패키지에 포함되어 있는데, 숫자 형식을 위해 DecimalFormat, 날짜 형식을 위해 SimpleDateFormat, 매개 변수화된 문자열 형식을 위해 MessageFormat 등을 제공한다.

 

1. 숫자 형식 클래스 (DecimalFormat)

DecimalFormat 은 숫자 데이터를 원하는 형식으로 표현하기 위해서 패턴을 사용하는데 다음 표는 패턴의 예를 보여준다.

적용할 패턴을 선택했다면 DecimalFormat 생성자 매개값으로 지정해서 객체를 생성하면 된다.

그리고 나서 format() 메소드를 호출해서 패턴이 적용된 문자열을 얻으면 된다.

DecimalFormat df =new DecimalFormat("#,##.0");

String result =df.format(1234567.89);

다음은 다양한 패턴을 적용해서 얻은 문자열을 출력한다.

public class DecimalFormatExample {
    
    public static void main(String[] args) {
        
        double num =1234567.89;
        
        DecimalFormat df =new DecimalFormat("0");
        System.out.println(df.format(num));
        
        df =new DecimalFormat("0.0");
        System.out.println(df.format(num));
        
        df =new DecimalFormat("0000000000.00000");
        System.out.println(df.format(num));
        
        df =new DecimalFormat("#");
        System.out.println(df.format(num));
        
        df=new DecimalFormat("#.#");
        System.out.println(df.format(num));
        
        
        
    }
    
}

1234568
1234567.9
0001234567.89000
1234568
1234567.9
 

2. 날짜 형식 클래스 (SimpleDateFormat)

Date 클래스의 toString() 메소드는 영문으로된 날짜를 리턴하는데 만약 특정 문자열 포맷으로 얻고 싶다면 java.text.SimpleDateFormat 클래스를

이용하면 된다. SimpleDateFormat 클래스도 날짜를 원하는 형식으로 표현하기 위해서 패턴을 사용하는데 다음 표는 SimpleDateFormat 의 패턴 작

성에 사용되는 기호들이다.

패턴문자 의미 패턴문자 의미
y H 시(0~23)
M h 시(1~12)
d k 시(0~11)
D 월 구분이 없는 일(1~365) k 시(1~24)
E 요일 m
오전/오후 s
w 년의 몇 번째 주 S 밀리세컨드(1/1000초)
W 월의 몇 번째 주    

 

패턴에는 자릿수에 맞게 기호를 반복해서 작성할 수 있다. 예를 들어 yyyy는 년도를 4자리로 표시하라는 의미이고, MM, dd 는 각각 달과 일을 2자리로 표시하라는 의미이다. 적용할 패턴을 작성했다면 이 패턴을 SimpleDateFormat 의 생성자 매개값으로 지정해서 객체를 생성하면 된다. 그리고 나서 format() 메소드를 호출해서 패턴이 적용된 문자열을 얻으면 된다.

 

SimpleDateFormat sdf =new SimpleDateFormat("yyyy년 MM월 dd일");

String strDate =sdf.format(new Date());

 

public class SimpleDateFormatExample {

    public static void main(String[] args) {
        
        Date now =new Date();
        
        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf.format(now));
        
        sdf =new SimpleDateFormat("yyyy년 MM월 dd일");
        System.out.println(sdf.format(now));
        
        sdf =new SimpleDateFormat("yyyy.MM.dd a HH:mm:ss");
        System.out.println(sdf.format(now));
        
        sdf=new SimpleDateFormat("오늘은 E요일");
        System.out.println(sdf.format(now));

        sdf =new SimpleDateFormat("올해의 D번째 날");
        System.out.println(sdf.format(now));
        
        sdf =new SimpleDateFormat("이달의 d번째 날");
        System.out.println(sdf.format(now));
        
    }
    
}

 

2016-06-11
2016년 06월 11일
2016.06.11 오후 15:26:12
오늘은 토요일
올해의 163번째 날
이달의 11번째 날

 

3. 문자열 형식 클래스(MessageFormat)

데이터를 파일에 저장하거나, 네트워크로 전송할 때, 그리고 데이터베이스 SQL문을 작성할 때 등 많은 부분에서 일정한 형식의 문자열을 사용한다.

MessageFormat 클래스를 사용하면 문자열에 데이터가 들어갈 자리를 표시해 두고, 프로그램이 실행하면서 동적으로 데이터를 삽입해 문자열을 완성시킬 수 있다.  예를 들어 다음과 같이 호원 정보를 출력한다고 가정해보자.

회원 ID : blue

회원 이름 : 최준호

회원 전화 :010-123-232

만약 id, name, tel 이라는 변수에 회원 정보가 저장되어 있을 경우 다음과 같이 문자열 연결 연산자(+)로 출력할 문자열을 생성할 수 있을 것이다.

String result ="회원 ID : "+ id + "\n회원 이름: " + name + "\n회원 전화 " + tel;

이 방법도 나쁜 방법은 아니지만, +연산자로 인해 복잡해 보이고, 전체 문자열을 파악하기 힘들다.

다음과 같이 MessageFormat 클래스를 사용하면 좀 더 깔끔하게 데이터를 삽입시켜주고 전체 문자열을 쉽게 예측할 수 있다.

 

String message ="회원 ID :  {0} \n회원 이름 : {1} \n 회원 전화 : {2}";

String result =MessageFormat.format(message, id, name, tel);

MessageFormat 은 정적 format()메소드를 호출해서 완성된 문자열을 리턴시킨다. format() 메소드의 첫 번째 매개값은 매개 변수화된 문자열을 지정하고, 두 번째 이후의 매개값은 인덱스 순선에 맞게 값을 나열하면 된다. 값을 나열하는 대신, 다음과 같이 배열을 대입해도 좋다.

String text ="회원 ID : {0} \n 회원 이름 : {1} \n회원 전화 : {2}";

Object[] arguments = { id, name, tel };

String result =MessageFormat.format(text, arguments);

 

다음은 매개 변수화된 문자열을 이용해서 회원 정보 및 SQL 문을 콘솔에 출력한다.

public class MessageFormatExample {
    
    public static void main(String[] args) {
        
        String id ="java";
        String name ="최준호";
        String tel ="010-000-4434";
        
        String text ="회원 ID : {0} \n회원 이름 : {1} \n회원 전화 : {2}";
        String result1 =MessageFormat.format(text, id, name, tel);
        System.out.println(result1);
        System.out.println();
        
        String sql ="insert into member values ( {0},  {1}, {2} )";
        Object[] arguments ={ "'java'",  "'신용권'", "''0101-2323-232" };
        String result2 =MessageFormat.format(sql, arguments);
        System.out.println(result1);
        
        
    }
    
}
 

회원 ID : java 
회원 이름 : 최준호 
회원 전화 : 010-000-4434

회원 ID : java 
회원 이름 : 최준호 
회원 전화 : 010-000-4434

 

 


 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

뱃가죽이 땅 두께 같다 , 염치없고 배짱이 센 사람을 조로하여 이르는 말.

댓글 ( 4)

댓글 남기기

작성

자바 목록    more