Format Class
jave.text package에 포함되어 있다.
Number, Date, text Data를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.
"123"과 같은 문자열을 Integer.parseInt()를 사용하여 123이라는 숫자로 변환하는 것과 같은 일이 가능하다는것을 의미한다.
형식화된 Data의 패턴만 정의하면 복잡한 문자열에서도 substring()을 사용하지 않고도 쉽게 원하는 값을 얻어 낼 수 있다.
DecimalFormat
Format class중에 Number를 형식화 하는데 사용한다.
number data를 정수, 부동소수점, 금액 등 다양한 형식으로 표현 할 수 있으며 일정한 형식의 text data를 숫자로 쉽게 변환하는 것도 가능하다.
기호 | 의미 | 패던 | 결과값(1234567.89) |
0 | 10진수 (값이 없을 때는0) | 0 0.0 000000000.0000 |
1234568 1234567.9 0001234567.8900 |
# | 10진수 | # #.# #########.#### |
1234568 1234567.9 1234567.89 |
. | 소수점 | #.# | 1234567.9 |
- | 음수부호 | #.#- -#.# |
1234567.9- -1234567.9 |
, | 단위 구분자 | #.###.## #.####.## |
1.234.567.89 123.4567.89 |
E | 지수 기호 | #E0 0E0 ##E0 00E0 ####E0 0000E0 #.#E0 0.0E0 0.000000000E0 00.00000000E0 000.0000000E0 #.########E0 ##.#######E0 ###.######E0 |
.1E7 1E6 1.2E6 12E5 123.5E4 1235E3 1.2E6 1.2E6 1.234567890E6 12.34567890E6 123.4567890E6 1.23456789E6 1.23456789E6 1.23456789E6 |
; | 패턴구분자 | #.###.##+;#.###.##- | 1.234.567.89+ (양수일 때) 1.234.567.89- (음수일 때) |
% | 퍼센트 | #.#% | 123456789% |
\u2030 | 퍼밀 (퍼센트 * 10) | #.#\u2030 | 1234567890‱ |
\u00A4 | 통화 | \u00A4 #.### | ₩ 1.234.568 |
' | escape문자 | '#'#.### "#.### |
#1,234,568 '1,234,568 |
// 숫자, 날짜 => 형식 문자열의 예
double number = 123456.789;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number);
// 형식 문자열 => 숫자, 날짜
DecimalFormat df2 = new DecimalFormat("#,###.##");
Number num = df2.parse("1,234,567,89");
double d = num.doubleValue();
//Number는 모든 숫자 Class의 최고 조상.
// * Integer.parseInt()는 ,가 포함된 문자열을 숫자로 변환 못한다.
// * Float.parseFloat()도 마찬가지.
패턴을 이용하여 숫자와 문자로 변환하는 예제
import java.text.*;
public class Ex {
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(); // d=1234567.89
System.out.print(d + " |숫자 => 문자| ");
System.out.println(df2.format(num));
}
catch(Exception e){
}
}
}
SimpleDateFormat
Date Data를 원하는 형태로 다양하게 출력할 수 있다.
기호 | 의미 | 보기 |
G | 연대(BC, AD) | AD |
y | 년도 | 2006 |
M | 월 (1~12 또는 1월 ~12월) | 10 또는 10월, OCT |
w | 년의 몇 번째 주 (1~53) | 50 |
W | 월의 몇 번째 주 (1~5) | 4 |
D | 년의 몇 번째 일(1~365) | 100 |
d | 월의 몇 번째 일(1~31) | 15 |
F | 월의 몇 번재 요일(1~5) | 1 |
E | 요일 | 월 |
a | 오전/오후 (AM, PM) | PM |
H | 시간 (0~23) | 20 |
k | 시간 (1~24) | 13 |
K | 시간 (0~11) | 10 |
h | 시간(1~12) | 11 |
m | 분 (0~59) | 35 |
s | 초 (0~59) | 55 |
S | 천분의 1초(0 ~ 999) | 253 |
z | Time zone(General time zone) | GMT+9:00 |
Z | Time zone(RFC 822 time zone) | +0900 |
' | escape문자 (특수문자를 표현하는데 사용) | 없음 |
* 보다 자세한 내용은 https://docs.oracle.com/javase/10/docs/api/java/text/SimpleDateFormat.html
예제
▶ 다양한 형식의 날짜 출력.
public class Ex {
public static void main(String[] args) {
Date today = new Date(); // 현재의 시간과 날짜를 저장한다.
SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;
sdf1 = new SimpleDateFormat("yyyy-MM-dd");
sdf2 = new SimpleDateFormat("''yy년 MMM dd일 E요일");
sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:SSS");
sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날 입니다.");
sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날 입니다.");
sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
sdf8 = new SimpleDateFormat("오늘은 올 해의 W번째 주입니다.");
sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일 입니다.");
System.out.println(sdf1.format(today));
System.out.println(sdf2.format(today));
System.out.println(sdf3.format(today));
System.out.println(sdf4.format(today));
System.out.println(sdf5.format(today));
System.out.println(sdf6.format(today));
System.out.println(sdf7.format(today));
System.out.println(sdf8.format(today));
System.out.println(sdf9.format(today));
// 2022-07-15
// '22년 7월 15일 금요일
// 2022-07-15 17:33:475
// 2022-07-15 17:33:35 오후
// 오늘은 올 해의 196번째 날 입니다.
// 오늘은 이 달의 15번째 날 입니다.
// 오늘은 올 해의 29번째 주입니다.
// 오늘은 올 해의 3번째 주입니다.
// 오늘은 이 달의 3번째 금요일 입니다.
}
▶ parse(String source)를 사용하여 date data의 출력형식을 변환하는 예제.
Inerger의 parseInt()가 문자열을 정수로 변환하듯 SimpleDate Format의 parse()는 문자열 source를 date data instance로 변환하기 때문에 유용하게 쓰일 수 있다.
public class Ex {
public static void main(String[] args) {
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
try{
Date d = df.parse("2019년 11월 23일");
// 문자열에서 날짜
System.out.println(df2.format(d));
// 날짜에서 문자열
}
catch (Exception e){
}
}
}
▶ 화면으로부터 날짜를 입력받아 계산결과를 출력하는 예제.
while과 try-catch문을 이용하여 사용자가 올바른 형식으로 입력할 때 까지 반복해서 입력받도록 하였다.
지정된 패턴으로 입력되지 않은 경우. parse method를 호출하는 부분에서 예외가 발생하기 때문에 while문을 벗어나지 못한다.
public class Ex {
public static void main(String[] args) {
String pattern = "yyyy/MM/dd";
DateFormat df = new SimpleDateFormat(pattern);
Scanner s = new Scanner(System.in);
Date inDate = null;
System.out.println("날짜를" + pattern + "형태로 입력하세요.(ex : 2019/12/31");
while(s.hasNext()) {
try{
inDate = df.parse(s.nextLine());
break;
}
catch(ParseException e){
System.out.println("날짜를" + pattern + "의 형태로 다시 입력하세요.");
}
}
Calendar cal = Calendar.getInstance();
cal.setTime(inDate);
Calendar today = Calendar.getInstance();
long day = (cal.getTimeInMillis() - today.getTimeInMillis()/(60*60*1000));
System.out.println("입력하신 날짜는 현재와" + day + "시간 차이가 있습니다.");
}
}
'JAVA' 카테고리의 다른 글
[Java] Collections Framework (0) | 2022.07.21 |
---|---|
[Java] Calendar Exercise (예제) (0) | 2022.07.19 |
[Java] Calendar Class (0) | 2022.07.14 |
[Java] Collections Framework (총정리) (0) | 2022.07.05 |
[Java] Method of Math (0) | 2022.06.29 |