서론
성적처리 프로그램을 작성했을 때 각 점수의 평균을 소수점 2자리로 일정하게 맞춰서 출력하려면 어떻게 해야 할까 고민해본 적이 있을 것이다.
- 평균값에 100을 곱하고 int형으로 형변환한 다음에 다시 1000f로 나누고 반올림하려면 Math.round()도 써야하고 등등 여러가지로 복잡해진다.
날짜를 형식에 맞게 출력하려면 숫자보다 더 복잡해진다.
- Calendar를 이용해서 년, 월, 일, 시, 분, 초를 각각 별도로 얻어서 조합을 해야 하는 과정을 거쳐야 한다.
자바에서는 이러한 문제들을 쉽게 해결하는 방법을 제공하는 데 그것이 바로 형식화 클래스이다.
형식화 클래스란?
- java.text패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.
- 형식화 클래스는 형식화에 사용될 패턴을 정의하는 데, 데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있다.
- 이것은 마치 “123”과 같은 문자열을 Integer.parseInt()를 사용해서 123이라는 숫자로 변환하는 것과 같은 일이 가능하다는 것을 의미한다!
즉, 형식화된 데이터의 패턴만 정의해주면 복잡한 문자열에서도 substring()을 사용하지 않고도 쉽게 원하는 값을 얻어낼 수 있다.
2.1 DecimalFormat
- 숫자를 형식화 하는 데 사용되는 것이 DecimalFormat이다.
- 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있으며, 반대로 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환하는 것도 가능하다.
형식화 클래스에서는 원하는 형식으로 표현 또는 변환하기 위해서 패턴을 정의하는 데, 형식화 클래스에서는 패턴을 정의하는 것이 전부라고 해도 과언이 아니다.
DecimalFormat의 패턴에 사용되는 기호들
DecimalFormat을 사용하는 방법
- 원하는 출력형식의 패턴을 작성하여 DecimalFormat인스턴스를 생성
- 출력하고자 하는 문자열로 format메서드를 호출
- 원하는 패턴에 맞게 변환된 문자열 획득가능
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number);
System.out.println(result);
//결과값: 1.2E6
자주 사용될 만한 패턴들을 작성해서 테스트
public static void main(String[] args) {
double number = 1234567.89;
String[] patterns = {
"0",
"#",
"0.0",
"#.#",
"0000000000.0000",
"######.####",
"#.#-",
"-#.#",
"#,###.##",
"#,####.##",
"#E0",
"0E0",
"##E0",
"00E0",
"####E0",
"0000E0",
"#.#E0",
"0.0E0",
"0.000000000E0",
"00.00000000E0",
"000.0000000E0",
"#.######E0",
"##.#####E0",
"###.####E0",
"#,###.##+;#,###.##-",
"#.#%",
"#.#\\u2030",
"\\u00A4 #,###",
"'#'#,###",
"''#,###"
};
for (int i = 0; i < patterns.length; i++) {
DecimalFormat df = new DecimalFormat(patterns[i]);
System.out.printf("%19s : %s\\n", patterns[i], df.format(number));
}
}
//결과
0 : 1234568
# : 1234568
0.0 : 1234567.9
#.# : 1234567.9
0000000000.0000 : 0001234567.8900
######.#### : 1234567.89
#.#- : 1234567.9-
-#.# : -1234567.9
#,###.## : 1,234,567.89
#,####.## : 123,4567.89
#E0 : .1E7
0E0 : 1E6
##E0 : 1.2E6
00E0 : 12E5
####E0 : 123.5E4
0000E0 : 1235E3
#.#E0 : 1.2E6
0.0E0 : 1.2E6
0.000000000E0 : 1.234567890E6
00.00000000E0 : 12.34567890E5
000.0000000E0 : 123.4567890E4
#.######E0 : 1.234568E6
##.#####E0 : 1.234568E6
###.####E0 : 1.234568E6
#,###.##+;#,###.##- : 1,234,567.89+
#.#% : 123456789%
#.#‰ : 1234567890‰
¤ #,### : ₩ 1,234,568
'#'#,### : #1,234,568
''#,### : '1,234,568
앞선 테스트 패턴들을 변형하여 새로운 패턴 생성 후 테스트
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.print(d + "-> ");
System.out.print(df2.format(num));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
//결과
1,234,567,89-> 1.23456789E8-> 1.235E8
- 패턴을 이용해서 숫자를 다르게 변환하는 예제이다.
- parse메서드를 이용하면 기호와 문자가 포함된 문자열을 숫자로 쉽게 변환할 수 있다.
- Integer.parseInt메서드는 콤마(.)가 포함된 문자열을 숫자로 변환하지 못한다.
parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드이며, 이 메서드의 선언부는 아래와 같다.
public Number parse(String source) throws ParseException
- Number 클래스는 Integer, Double과 같은 숫자를 저장하는 래퍼 클래스의 조상이며, doubleValue()는 Number에 저장된 값을 double형의 값으로 변환하여 반환한다.
- 이 외에도 intValue(), floatValue() 등의 메서드가 Number클래스에 정의되어 있다.
'개발 > JAVA' 카테고리의 다른 글
[JAVA] ==, equals, equalsIgnoreCase 의 차이점 (2) | 2024.10.28 |
---|---|
[자바의 정석] 형식화 클래스 2-2 SimpleDateFormat (2) | 2024.01.11 |
[자바의 정석] Calendar와 Date (3) | 2024.01.08 |
[JAVA] StringTokenizer (0) | 2023.07.31 |