[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개 있습니다."
'언어 > Java' 카테고리의 다른 글
| [Java] 서블릿(Servlet)이란? - 생명주기, 설정 방식, 서블릿 컨테이너 (0) | 2026.03.30 |
|---|---|
| [Java] 수학 관련 클래스(Random, Math) (0) | 2026.03.15 |
| [Java] 날짜 클래스(Date, Calendar)와 지역과 시간대 클래스(Locale, Timezone) (0) | 2026.03.05 |
| [Java] Object 클래스(equals / hashCode / toString / 스레드) (0) | 2026.03.05 |
| [Java] 정규 표현식(regular expression)과 Pattern/Matcher 클래스 (0) | 2026.03.04 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자