형식화 클래스 - DecimalFormat

정순동·2023년 12월 15일
0

자바기초

목록 보기
54/89
post-thumbnail

성적 처리 프로그램을 작성할 때 각 점수의 평균을 소수점 2자리로 맞추기 위해 평균값에 100을 곱하고 int형으로 변환한 후 100f로 나누고 반올림을 위해 Math.round()도 사용하고..

날짜를 형식에 맞게 출력하려 Calendar를 이용하여 년, 월, 일, 시, 분, 초를 별도로 얻어서 조합하고 이러한 과정이 매우 귀찮다.

자바에서는 이러한 문제들을 쉽게 해결할 수 있게 하나의 방법을 제공하는데 그 것이 바로 형식화 클래스 이다.

이 클래스는 java.text패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.

형식화 클래스는 형식화에 사용될 패턴을 정의하는데, 데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있다.

마치 "123"같은 문자열을 Integer.parseInt()를 사용해서 123이라는 숫자로 변환하는 것과 같은 일이 가능하다는 것을 의미한다. 즉, 형식화된 데이터의 패턴만 정의해주면 복잡한 문자열에서도 substring()을 사용하지 않고도 수비게 원하는 값을 얻어낼 수 있다.

DecimalFormat

숫자를 형식화 하는데 사용되는 것이 DecimalFormat이다. DecimalFormat을 이용해 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있다.

DecimalFormat을 사용하는 방법은 간단한데, 원하는 출력형식의 패턴을 작성하여 DecimalFormat인스턴스를 생성한 다음, 출력하고자 하는 문자열로format메서드를 호출하면 원하는 패턴에 맞게 변환된 문자열을 얻는다.

	double number = 1234567.89;
    DecimalFormat df = new DecimalFormat("#.#E0");
    String result = df.format(number);	// result = "1.2E6"

예제

import java.text.DecimalFormat;

public class DecimalFormatExample {
    public static void main(String[] args) throws Exception{
        double number = 1234567.89;
        String[] pattern = {
                "0",
                "#",
                "0.0",
                "#.#",
                "0000000000.0000",
                "##########.#####",
                "#.#-",
                "-#.#",
                "#,###.##",
                "#,####.##",
                "#E0",
                "0E0",
                "##E0",
                "00E0",
                "####E0",
                "#.#E0",
                "0.0E0",
                "0.000000000E0",
                "00.00000000E0",
                "000.0000000E0",
                "#.#########E0",
                "##.########E0",
                "###.#######E0",
                "#,###.##+;#,###.##-",
                "#.#%",
                "#.#\u2030",
                "\u00A4 #,###",
                "'#'#,###",
                "''#,###",
        };

        for(int i = 0; i < pattern.length; i++) {
            DecimalFormat df = new DecimalFormat(pattern[i]);
            System.out.printf("%19s : %s\n", pattern[i], df.format(number));
        }
    }
}

만약 문자열에 1,000,000 같이 콤마가 있을 때에는 아래와 같은 코드로 바꿀 수 있다.

import java.text.DecimalFormat;

public class DecimalFormatExample2 {
    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();
            System.out.println(d + " -> ");

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

parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드이다. ↓

	public Number parse(String source) throws ParseException

Number클래스는 iNteger, Double과 같은 숫자를 저장하는 래퍼 클래스의 조상이며, doubleValue()는 Number에 저장된 값을 double형의 값으로 변환하여 반환한다. 이 외에도 intValue(), floatValue()등의 메서드가 Number클래스에 정의돼 있다.

0개의 댓글