우와한 개발자

[Java] 형식화클래스(DecimalFormat, SimpleDateFormat, MessageFormat, ChoiceFormat)

by 우와한개발자

[ 형식화클래스 ]

형식화 클래스들은 java.text 패키지에 정의되어 있으며, 숫자·날짜·문자열을 원하는 형식으로 출력할 때 사용

 

1. DecimalFormat

  • 숫자 데이터를 원하는 형식의 문자열로 표현하기 위한 클래스.
  • 패턴을 지정해서 정수, 소수, 백분율, 통화 등 다양한 형식으로 출력 가능

1) 주요 패턴 기호

기호 의미
0 숫자. 자릿수만큼 앞에 0을 채움
# 숫자. 0은 표시하지 않음
. 소수 구분 기호
, 그룹화 구분 기호 (천 단위 구분)
- 음수 기호
E 과학 표기법 (가수와 지수 구분)
% 100을 곱하고 백분율로 표시
\u2030 1000을 곱하고 퍼밀리(‰)로 표시
; 양수/음수 패턴 구분
' 접두사/접미사에 특수문자 사용 시 감쌈
import java.text.DecimalFormat;

DecimalFormat df = new DecimalFormat("###,###.###");
df.format(123456.789);   // "123,456.789"

new DecimalFormat("000000.000").format(12345.67);  // "012345.670"
new DecimalFormat("#.##%").format(0.5);            // "50%"
new DecimalFormat("$###,###.###").format(12345.67); // "$12,345.67"
new DecimalFormat("\u20a9###,###").format(12345.67); // "₩12,346"

// 독일 로케일 적용 (소수점과 천 단위 구분자가 반대)
DecimalFormat deFormatter = (DecimalFormat) NumberFormat.getNumberInstance(new Locale("de", "DE"));
deFormatter.applyPattern("###,###.###");
deFormatter.format(123.450); // "123,450" (독일식)

 

2. SimpleDateFormat

  • 날짜를 원하는 형식의 문자열로 변환하거나, 문자열을 Date 객체로 파싱할 때 사용

1) 날짜/시간 패턴 문자

  • 0, # : 자리수 표현할때
문자 의미 예시
y 연도 2017, 17
M 07, Jul, July
d 10
E 요일 이름 Tuesday, Tue
a 오전/오후 PM
H 시간 (0~23) 22
h 시간 (1~12) 10
m 30
s 55
S 밀리초 978
z 타임존 (일반) KST, GMT+09:00
Z 타임존 (RFC 822) +0900
G 시대 AD, 서기
// 날짜 → 문자열
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String result = sdf.format(new Date()); // "2017-03-13 22:16:55"

// 로케일 지정
DateFormat df = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z", new Locale("ko", "KR"));
// → "2017.03.13 서기 at 22:16:55 KST"

// TimeZone 변경
df.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

 

3. MessageFormat

  • 언어에 중립적인 방법으로 여러 값을 조합한 메시지 문자열을 생성할 때 사용
  • {인덱스} 자리에 인자를 삽입
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
FormatType FormatStyle 예시
number integer, currency, percent
date short, medium, long, full
time short, medium, long, full
choice ChoiceFormat 패턴
// 기본 사용
Object[] args = {"foo", "bar", new Long(99)};
MessageFormat mf = new MessageFormat("1:{0} 2:{1} 3:{2}");
mf.format(args); // "1:foo 2:bar 3:99"

// 날짜/숫자 포맷 지정
String result = MessageFormat.format(
    "오늘({0, date}) {1, number, integer}시에 {2}가 있습니다.",
    new Date(), 10, "대회의실에서 면접 심사"
);
// → "오늘(2017. 3. 13) 10시에 대회의실에서 면접 심사가 있습니다."

 

4. ChoiceFormat

  • 숫자 범위에 따라 다른 문자열을 선택하는 클래스
  • 주로 MessageFormat과 함께 사용
double[] limits  = { 범위1, 범위2, 범위3, ... };
String[] formats = { "문자열1", "문자열2", "문자열3", ... };
ChoiceFormat cf = new ChoiceFormat(limits, formats);
⚠️limit 배열과 format 배열 주의사항
- limits 배열은 반드시 오름차순으로 지정
- limits와 formats 배열의 길이는 동일해야 함
- 각 항목은 해당 limit 값 이상 ~ 다음 limit 값 미만의 범위를 가짐
// 요일 선택
double[] limits = {1, 2, 3, 4, 5, 6, 7};
String[] days   = {"Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"};
ChoiceFormat cf = new ChoiceFormat(limits, days);
cf.format(1); // "Sun"
cf.format(5); // "Thur"

// MessageFormat과 조합
MessageFormat msgForm = new MessageFormat("{0}의 바구니에 사과가 {1}");
double[] appleLimits = {0, 1, 2};
String[] applePart   = {"없습니다.", "1개 있습니다.", "{1, number}개 있습니다."};
ChoiceFormat appleForm = new ChoiceFormat(appleLimits, applePart);
msgForm.setFormatByArgumentIndex(1, appleForm);

//→ {0} = "그", {1} = 2 → appleForm이 2를 받아 "{1,number}개 있습니다." 선택 
//→ 최종적으로 "2개 있습니다." 출력.

msgForm.format(new Object[]{"그",  new Long(2)}); // "그의 바구니에 사과가 2개 있습니다."
msgForm.format(new Object[]{"그녀", new Long(0)}); // "그녀의 바구니에 사과가 없습니다."
msgForm.format(new Object[]{"나",  new Long(1)}); // "나의 바구니에 사과가 1개 있습니다."

 

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기