JavaRush /Java Blog /Random-KO /Java에서 숫자 출력 형식 지정

Java에서 숫자 출력 형식 지정

Random-KO 그룹에 게시되었습니다
안녕하세요 여러분! 우리의 메소드에는 특별한 형식으로 표시해야 하는 숫자가 포함되는 경우가 많습니다. 작은 일처럼 보이지만 이 작업을 어떻게 구현하시겠습니까? Java에서 숫자 출력 형식 지정 - 1오늘 이것에 대해 조금 생각해 보시기 바랍니다. 먼저 Java의 숫자 형식을 살펴보기 위해 String 클래스 의 형식 메소드 를 기억해 보겠습니다 . public static String format(String format, Object... args) - 나머지 args 인수를 사용하여 형식 문자열 에서 형식화된 문자열을 반환합니다 . 예를 들면 다음과 같습니다.
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에는 다른 유형이 있습니다. 그렇죠? 이제 전체 무기고를 살펴 보겠습니다.
형식을 지정할 값 유형
%에스 문자열로 캐스팅될 모든 유형
String.format("Hi %s!","world")
결과:
안녕하세요 월드!
%비 부울 로 변환될 모든 유형 : true - 값이 null이 아닌 경우, false - null인 경우
String.format("Hi %b!",null)
결과:
안녕하세요 거짓
%시간 hashCode() 메소드 에서 16진수 값 문자열로 캐스팅될 모든 객체를 전달할 수 있습니다.
String.format("Hi %h!","world")
결과:
안녕하세요 106c44!
%씨 유니코드 문자( char ) 를 지정하는 데 사용됩니다.
String.format("Hello m%cr!",'And')
결과:
안녕하세요 월드!
%디 정수가 지정되었습니다( int.byte, short, int, long, BigInteger ) .
String.format("I'm already %d!",20)
결과:
저는 벌써 20살이에요!
%에프 부동 소수점 숫자를 지정하는 데 사용됩니다.
String.format("PI is - %f!", 3.14159)
결과:
PI 번호는 - 3.141590입니다!
%이자형 과학적 표기법의 부동 소수점 숫자
String.format("PI is - %e!", 3.14159);
결과:
PI 번호는 - 3.141590e+00입니다!
%ㅏ 부동 소수점 숫자는 16진수로 표시됩니다.
String.format("PI is - %a!", 3.14159)
결과:
PI 번호는 - 0x1.921f9f01b866ep1입니다!
%엑스 정수가 전달됩니다( int. byte, short, int, long, BigInteger ). 형식 지정 결과는 ASCII 테이블에 지정된 숫자를 가진 문자가 됩니다.
String.format("I'm already %x!",25)
결과:
저는 벌써 19살이에요!
%영형 정수( int. byte, short, int, long, BigInteger )가 허용되며 8진수로 표시됩니다.
String.format("I already %o!",25);
결과:
저는 벌써 31살이에요!
%티 날짜 및 시간 변환을 위한 접두사입니다. 형식을 지정하려면 추가 플래그가 필요합니다.
String.format("Today is %tA",new Date())
결과:
오늘은 토요일이다
%N 플랫폼별 줄 구분 기호입니다. 아날로그\n
String.format("Hello %n Hello")
결과:
안녕 안녕
double 에 더 적합한 형식을 사용해 보겠습니다.
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의 doublefloat 와 같은 데이터 유형을 포함하는 부동 소수점 숫자에 더 적합한 지정자입니다 . 이 지정자를 사용하면 부동 소수점 숫자의 형식을 지정할 수 있습니다.
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
이 지정자에 .2를 삽입하면 소수 자릿수가 2로 잘려 출력이 제공됩니다.
키예프에서 오데사까지의 거리는 475.40입니다. 별로 적지 않죠?
.2 는 지정자에 대한 유일한 조정이 아닙니다. 이러한 하위 설정의 조합을 명령 이라고 합니다 . 지침의Java에서 숫자 출력 형식 지정 - 2 일반적인 형태는 다음과 같습니다.
%[argument_index][flags][width][.precision]유형 지정자
이제 모든 것을 순서대로 해독해 보겠습니다.
  • [argument_index] 는 인수 목록의 위치를 ​​나타내는 정수입니다. 예를 들어, 첫 번째 인수에 대한 링크는 $1이고, 두 번째 인수에 대한 링크는 $2입니다. 위치가 지정되지 않은 경우 인수는 형식 문자열에서 참조되는 순서와 동일해야 합니다.
  • [플래그]는 서식 지정을 위한 특수 문자입니다. 예를 들어:
    • 숫자 값이 양수인 경우 + 기호를 포함해야 함을 나타내는 + 플래그
    • - 결과를 왼쪽으로 정렬한다는 뜻입니다.
    • , 정수의 천 단위 구분 기호를 설정합니다.
  • [너비]는 출력될 최소 문자 수를 지정하는 양의 십진 정수입니다. 이 숫자 앞에 0이 있으면 누락된 문자가 0으로 채워지고, 0이 없으면 공백으로 채워집니다.
  • [.accuracy]는 앞에 점이 오는 음수가 아닌 정수입니다. 일반적으로 문자 수를 제한하는 데 사용됩니다. 특정 동작은 특정 유형의 지정자에 따라 달라집니다.
또한 위의 지침 요소는 모두 선택 사항이며 해당 요소 없이도 모든 것이 작동한다는 점에 유의하고 싶습니다. 하위 설정을 사용하는 예로 Pi 숫자의 특정 출력이 필요하다고 가정해 보겠습니다.
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 객체를 생성할 필요는 없습니다. applyPatternapplyLocalizedPattern 메소드를 사용하면 충분합니다 .
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
부동 소수점 숫자의 서식 지정에 대해 이야기할 때 우리는 반올림에 관심이 많습니다. 그렇지 않습니까? 따라서 지정된 패턴을 벗어나는 소수 자릿수가 있는 숫자를 잘라낼 때 DecimalFormat은 마지막으로 잘라낸 숫자가 5보다 크면 숫자를 반올림합니다. 마지막으로 잘라낸 숫자가 5이면 어떻게 되나요? 실제로 이 경우 이 숫자는 가장 가까운 정수 사이의 정확히 중간에 있습니다. Java에서 숫자 출력 형식 지정 - 3이 경우 이전 번호가 고려됩니다. 이전 숫자가 짝수이면 반올림이 수행됩니다.
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 클래스를 사용하는 방법에 대해 이야기하겠습니다 . 이 수업은 정말 큰 숫자를 다루는 데 중점을 두고 있습니다. 그러기 위해서는 최대 doublefloat 값이 너무 작습니다. 이 클래스에는 부동 소수점 반올림을 위한 다양한 설정과 산술 연산을 위한 다양한 메서드가 있습니다. 비슷한 클래스가 있지만 LARGE 정수인 BigInteger 작업에 중점을 둡니다 . 이 기사 에서 BigDecimalBigInteger 에 대한 자세한 내용을 읽을 수 있습니다 .

날짜 및 시간 형식 지정

위에서는 String 클래스 의 format()을 사용하여 시간과 날짜의 형식을 지정할 수도 있다는 점만 언급했습니다 . 글쎄, 그것이 어떻게 완료되었는지 살펴 보겠습니다. 먼저 날짜에는 %t 형식 지정자가 사용된다는 점을 알려드립니다 . 둘째, 템플릿 형식을 지정할 때 날짜의 각 형식 지정자에 대해 추가 형식 지정 플래그가 필요합니다. 날짜에 사용할 수 있는 형식 지정 플래그는 다음과 같습니다.Java에서 숫자 출력 형식 지정 - 4
플래그 설명
%결핵 월의 전체 이름(예: 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 등과 같은 시간대 약어입니다.
이것은 가능한 날짜 형식 지정 플래그의 축약된 목록입니다. 모든 취향에 맞는 플래그가 많이 있습니다. 전체 목록과 가능한 지정자는 이 링크 에서 찾을 수 있습니다 . 이것을 어떻게 사용하는지 살펴보겠습니다. 이번에는 String.format()을 사용하지 않고 즉시 System.out.printf()를 사용합니다 .

실시예 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의 시간과 날짜에 대해 더 자세히 알아볼 수 있습니다 . 오늘은 여기까지입니다. 관심을 가져주셔서 감사합니다!Java에서 숫자 출력 형식 지정 - 5
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION