안녕하세요 여러분! 우리의 메소드에는 특별한 형식으로 표시해야 하는 숫자가 포함되는 경우가 많습니다. 작은 일처럼 보이지만 이 작업을 어떻게 구현하시겠습니까? 오늘 이것에 대해 조금 생각해 보시기 바랍니다. 먼저 Java의 숫자 형식을 살펴보기 위해 String 클래스 의 형식 메소드 를 기억해 보겠습니다 . public static String format(String format, Object... args) - 나머지 args 인수를 사용하여 형식 문자열 에서 형식화된 문자열을 반환합니다 . 예를 들면 다음과 같습니다.
double 에 더 적합한 형식을 사용해 보겠습니다.
이것은 가능한 날짜 형식 지정 플래그의 축약된 목록입니다. 모든 취향에 맞는 플래그가 많이 있습니다. 전체 목록과 가능한 지정자는 이 링크 에서 찾을 수 있습니다 . 이것을 어떻게 사용하는지 살펴보겠습니다. 이번에는 String.format()을 사용하지 않고 즉시 System.out.printf()를 사용합니다 .
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
결과적으로 콘솔에 다음과 같은 출력이 표시됩니다.
안녕하세요 사샤! 직장 상황은 어떻습니까?
printf 및 형식 메소드
String.format()은 문자열 형식을 지정하는 유일한 방법은 아닙니다. 그 유사품은 System.out.printf() 및 System.out.format()입니다. . 따라서 이전 코드를 다음으로 바꿀 수 있습니다.System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
또는
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
콘솔의 출력은 동일하게 유지됩니다. 유일한 차이점은 String.format() 과 달리 이러한 메서드는 콘솔에 값을 즉시 표시한다는 것입니다 . 하지만 저는 String.format()을 더 좋아합니다. 왜냐하면 항상 콘솔에 결과를 표시할 필요가 없기 때문입니다. 그래서 우리는 이 방법을 더 사용할 것입니다. 우리의 예로 돌아가 보겠습니다. 우리는 무엇을 봅니까? 그리고 사실 %s 문자가 있는 곳에 "Sasha" 및 "at work" 줄이 삽입됩니다 . 이것이 개발에 어떻게 도움이 될 수 있습니까? 큰 템플릿 텍스트가 있는데 어떤 곳에서는 다를 수 있고 외부에서 인수로 올 수 있는 값을 삽입해야 한다고 상상해 보세요. 이 형식이 유용한 곳입니다. 형식 지정자는 퍼센트 기호(%)로 시작하고 형식을 지정할 인수 유형을 나타내는 문자로 끝납니다. 그리고 아시다시피 %s는 객체(문자열)를 삽입하는 데 사용됩니다. 그러나 예를 들어 문자열 객체가 등록된 위치에 double을 삽입하려고 하면 다음과 같습니다 .
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
이것도 작동합니다. double은 문자열로 캐스팅되어 다음과 같은 결과를 얻습니다.
안녕하세요 - 55.6! 직장 상황은 어떻습니까?
문자열과 부동 소수점 숫자 외에도 Java에는 다른 유형이 있습니다. 그렇죠? 이제 전체 무기고를 살펴 보겠습니다.
형식을 지정할 값 유형 | 예 | |
---|---|---|
%에스 | 문자열로 캐스팅될 모든 유형 |
결과:
안녕하세요 월드!
|
%비 | 부울 로 변환될 모든 유형 : true - 값이 null이 아닌 경우, false - null인 경우 |
결과:
안녕하세요 거짓
|
%시간 | hashCode() 메소드 에서 16진수 값 문자열로 캐스팅될 모든 객체를 전달할 수 있습니다. |
결과:
안녕하세요 106c44!
|
%씨 | 유니코드 문자( char ) 를 지정하는 데 사용됩니다. |
결과:
안녕하세요 월드!
|
%디 | 정수가 지정되었습니다( int.byte, short, int, long, BigInteger ) . |
결과:
저는 벌써 20살이에요!
|
%에프 | 부동 소수점 숫자를 지정하는 데 사용됩니다. |
결과:
PI 번호는 - 3.141590입니다!
|
%이자형 | 과학적 표기법의 부동 소수점 숫자 |
결과:
PI 번호는 - 3.141590e+00입니다!
|
%ㅏ | 부동 소수점 숫자는 16진수로 표시됩니다. |
결과:
PI 번호는 - 0x1.921f9f01b866ep1입니다!
|
%엑스 | 정수가 전달됩니다( int. byte, short, int, long, BigInteger ). 형식 지정 결과는 ASCII 테이블에 지정된 숫자를 가진 문자가 됩니다. |
결과:
저는 벌써 19살이에요!
|
%영형 | 정수( int. byte, short, int, long, BigInteger )가 허용되며 8진수로 표시됩니다. |
결과:
저는 벌써 31살이에요!
|
%티 | 날짜 및 시간 변환을 위한 접두사입니다. 형식을 지정하려면 추가 플래그가 필요합니다. |
결과:
오늘은 토요일이다
|
%N | 플랫폼별 줄 구분 기호입니다. 아날로그\n |
결과:
안녕 안녕
|
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
콘솔 출력:
키예프에서 오데사까지의 거리는 475.400000입니다. 별로 적지 않죠?
아시다시피 %f는 Java의 double 및 float 와 같은 데이터 유형을 포함하는 부동 소수점 숫자에 더 적합한 지정자입니다 . 이 지정자를 사용하면 부동 소수점 숫자의 형식을 지정할 수 있습니다.
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
이 지정자에 .2를 삽입하면 소수 자릿수가 2로 잘려 출력이 제공됩니다.
키예프에서 오데사까지의 거리는 475.40입니다. 별로 적지 않죠?
.2 는 지정자에 대한 유일한 조정이 아닙니다. 이러한 하위 설정의 조합을 명령 이라고 합니다 . 지침의 일반적인 형태는 다음과 같습니다.
%[argument_index][flags][width][.precision]유형 지정자
이제 모든 것을 순서대로 해독해 보겠습니다.
- [argument_index] 는 인수 목록의 위치를 나타내는 정수입니다. 예를 들어, 첫 번째 인수에 대한 링크는 $1이고, 두 번째 인수에 대한 링크는 $2입니다. 위치가 지정되지 않은 경우 인수는 형식 문자열에서 참조되는 순서와 동일해야 합니다.
- [플래그]는 서식 지정을 위한 특수 문자입니다. 예를 들어:
- 숫자 값이 양수인 경우 + 기호를 포함해야 함을 나타내는 + 플래그
- - 결과를 왼쪽으로 정렬한다는 뜻입니다.
- , 정수의 천 단위 구분 기호를 설정합니다.
- [너비]는 출력될 최소 문자 수를 지정하는 양의 십진 정수입니다. 이 숫자 앞에 0이 있으면 누락된 문자가 0으로 채워지고, 0이 없으면 공백으로 채워집니다.
- [.accuracy]는 앞에 점이 오는 음수가 아닌 정수입니다. 일반적으로 문자 수를 제한하는 데 사용됩니다. 특정 동작은 특정 유형의 지정자에 따라 달라집니다.
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
따라서 콘솔의 출력은 다음과 같습니다.
+03.14159
쉬운 것 같죠? 하지만 숫자 형식을 지정하는 경우 DecimalFormat을 무시할 수 없습니다 . 이것이 무엇을 의미하는지 알아 봅시다.
십진수 형식
DecimalFormat은 정수 또는 부동 소수점 숫자 등 Java에서 모든 숫자의 형식을 지정하는 클래스입니다. DecimalFormat 객체가 생성 되면 생성자에서 직접 들어오는 숫자의 형식을 지정하기 위한 템플릿을 지정할 수 있습니다. DecimalFormat을 사용하는 예제는 다음과 같습니다 .DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
콘솔 출력:
72,224
#.### 줄은 전달된 값의 형식을 소수점 이하 3자리로 지정함을 나타내는 패턴입니다. 패턴에 사용할 수 있는 다른 기호는 무엇입니까? 그 중 일부는 다음과 같습니다.
- # — 숫자, 선행 0은 생략됩니다.
- 0 - 숫자의 자릿수가 더 적은 경우에도 숫자가 항상 표시됩니다(이 경우 0이 표시됨).
- . — 소수 구분 기호;
- , — 구분 기호 그룹화 기호(예: 천 단위 구분 기호);
- ; — 형식을 분리합니다.
- - — 음수의 접두사를 표시합니다.
- % - 100을 곱하고 숫자를 백분율로 표시합니다.
- ? — 1000을 곱하고 숫자를 ppm 단위로 표시합니다.
- E - 과학적 표기법을 위해 가수와 지수를 구분합니다.
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
콘솔 출력:
74,554,542.22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
콘솔 출력:
%72.35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
콘솔 출력:
042.224
새로운 템플릿을 정의하기 위해 매번 새로운 DecimalFormat 객체를 생성할 필요는 없습니다. applyPattern 및 applyLocalizedPattern 메소드를 사용하면 충분합니다 .
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
부동 소수점 숫자의 서식 지정에 대해 이야기할 때 우리는 반올림에 관심이 많습니다. 그렇지 않습니까? 따라서 지정된 패턴을 벗어나는 소수 자릿수가 있는 숫자를 잘라낼 때 DecimalFormat은 마지막으로 잘라낸 숫자가 5보다 크면 숫자를 반올림합니다. 마지막으로 잘라낸 숫자가 5이면 어떻게 되나요? 실제로 이 경우 이 숫자는 가장 가까운 정수 사이의 정확히 중간에 있습니다. 이 경우 이전 번호가 고려됩니다. 이전 숫자가 짝수이면 반올림이 수행됩니다.
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
콘솔 출력:
56,459
홀수이면 수행되지 않습니다.
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
콘솔 출력:
56,459
String.format() 과 DecimalFormat.format()을 사용하여 부동 소수점 숫자 형식을 지정하는 것의 차이점은 첫 번째 경우 소수 부분이 없더라도 뒤에 0이 있다는 것입니다. 예를 들어:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
콘솔 출력:
9.0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
콘솔 출력:
9
보시 다시피 소수점 이하 4자리의 정확도로 숫자 9.00001273 의 형식을 지정할 때 String 클래스 의 format() 메서드는 값 9.0000을 출력하는 반면 DecimalFormat 의 유사한 format() 메서드 는 9를 출력합니다 .
BigDecimal 및 BigInteger
Java에서 숫자 반올림에 대한 주제를 다루었으므로 이러한 작업에 BigDecimal 클래스를 사용하는 방법에 대해 이야기하겠습니다 . 이 수업은 정말 큰 숫자를 다루는 데 중점을 두고 있습니다. 그러기 위해서는 최대 double 및 float 값이 너무 작습니다. 이 클래스에는 부동 소수점 반올림을 위한 다양한 설정과 산술 연산을 위한 다양한 메서드가 있습니다. 비슷한 클래스가 있지만 LARGE 정수인 BigInteger 작업에 중점을 둡니다 . 이 기사 에서 BigDecimal 및 BigInteger 에 대한 자세한 내용을 읽을 수 있습니다 .날짜 및 시간 형식 지정
위에서는 String 클래스 의 format()을 사용하여 시간과 날짜의 형식을 지정할 수도 있다는 점만 언급했습니다 . 글쎄, 그것이 어떻게 완료되었는지 살펴 보겠습니다. 먼저 날짜에는 %t 형식 지정자가 사용된다는 점을 알려드립니다 . 둘째, 템플릿 형식을 지정할 때 날짜의 각 형식 지정자에 대해 추가 형식 지정 플래그가 필요합니다. 날짜에 사용할 수 있는 형식 지정 플래그는 다음과 같습니다.플래그 | 설명 |
---|---|
%결핵 | 월의 전체 이름(예: 1월, 2월 등) |
%결핵 | 월의 약식 이름입니다(예: Jan, Feb 등). |
%고마워 | 요일의 전체 이름(예: 일요일, 월요일) |
%고마워 | 요일의 약칭(예: Sun, Mon 등)입니다. |
%tY | 4자리 형식의 연도(예: 0000~9999) |
%ty | 2자리 형식의 연도(예: 00~99) |
%tm | 월의 시작 부분은 0으로 지정됩니다(예: 01~12). |
%tc | %ta %tb %td %tT %tZ %tY 형식의 날짜 및 시간(예: Mon Feb 17 03:56:12 PST 2020) |
%tD | %tm/%td/%ty 형식의 날짜 |
%td | 두 자리 형식의 월 일(예: 01~31) |
%te | 앞에 0이 없는 형식의 날짜(예: 1~31) |
%tT | 24시간 형식의 시간(예: %tH:%tM:%tS) |
%tH | 24시간 형식의 시간(00~23) |
%tI | 12시간 형식의 시간(예: 01~12) |
%tM | 시간의 분은 앞에 0이 붙는 형식입니다(예: 00~59). |
%tS | 2자리 숫자로 구성된 분의 초(예: 00~59) |
%tZ | PST, UTC 등과 같은 시간대 약어입니다. |
실시예 1
또한 결과 언어를 메서드의 첫 번째 인수로 전달하여 설정합니다.Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
콘솔 출력:
2020년 10월 11일
언어를 지정하지 않으면 기본 언어가 사용됩니다(예: 러시아어를 사용합니다).
실시예 2
좀 더 완전한 날짜를 표시해 보겠습니다.Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
콘솔의 출력은 다음과 같습니다.
2020년 10월 11일 13:43:22
동일한 Date 객체를 인수로 여러 번 전달하는 중... 별로 좋아 보이지 않죠? $ 내부 하위 집합을 사용하여 사용하려는 인수를 지정해 보겠습니다.
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
콘솔의 출력은 변경되지 않습니다. 날짜 형식을 지정하는 다른 흥미로운 방법도 있습니다. 이 자료 에서 Java의 시간과 날짜에 대해 더 자세히 알아볼 수 있습니다 . 오늘은 여기까지입니다. 관심을 가져주셔서 감사합니다!
GO TO FULL VERSION