자바에서 printf ()로 포맷하기

1. 소개

이 튜토리얼에서는 printf () 메서드를 사용한 다양한 형식 지정 예제를 보여줍니다 .

이 메서드는 java.io.PrintStream 클래스의 일부이며 C 의 printf () 함수 와 유사한 문자열 형식을 제공합니다 .

2. 구문

다음 PrintStream 메서드 중 하나를 사용 하여 출력 형식을 지정할 수 있습니다 .

System.out.printf(format, arguments); System.out.printf(locale, format, arguments);

format 매개 변수를 사용하여 형식화 규칙을 지정합니다 . 규칙은 '%' 문자로 시작 합니다.

다양한 형식 지정 규칙에 대한 세부 정보를 살펴보기 전에 간단한 예를 살펴 보겠습니다.

System.out.printf("Hello %s!%n", "World");

그러면 다음과 같은 출력이 생성됩니다.

Hello World!

위에 표시된대로 형식 문자열에는 일반 텍스트와 두 개의 형식 규칙이 포함됩니다. 첫 번째 규칙은 문자열 인수의 형식을 지정하는 데 사용됩니다. 두 번째 규칙은 문자열 끝에 개행 문자를 추가합니다.

2.1. 형식 규칙

형식 문자열을 좀 더 자세히 살펴 보겠습니다. 리터럴과 형식 지정자로 구성됩니다. 형식 지정 자는 다음 순서 로 플래그, 너비, 정밀도 및 변환 문자 를 포함합니다.

%[flags][width][.precision]conversion-character

대괄호 안의 지정자는 선택 사항입니다.

내부적으로 printf () 는 java.util.Formatter 클래스를 사용하여 형식 문자열을 구문 분석하고 출력을 생성합니다. 추가 형식 문자열 옵션은 Formatter Javadoc에서 찾을 수 있습니다.

2.2. 변환 문자

변환 문자가 필요한 인수를 포맷하는 방법을 결정한다 . 변환 문자는 특정 데이터 유형에만 유효합니다. 몇 가지 일반적인 것 :

  • s – 문자열 형식
  • d – 십진 정수 형식
  • f – 부동 소수점 숫자 형식
  • t – 날짜 / 시간 값 형식

우리는이 기사의 뒷부분에서 이것과 다른 몇 가지를 살펴볼 것입니다.

2.3. 선택적 수정 자

[플래그] 출력을 수정하는 표준 방법을 정의 소수점 숫자를 정수 포맷 및 부동 가장 일반적인를하고 있습니다.

[width] 는 인수를 출력하기위한 필드 너비를 지정합니다. 출력에 기록되는 최소 문자 수를 나타냅니다.

[.precision] 부동 소수점 값을 출력 할 때 정밀도의 자릿수를 지정 합니다. 또한 String 에서 추출 할 하위 문자열의 길이를 정의하는 데 사용할 수 있습니다.

3. 줄 분리기

문자열을 별도의 줄로 나누기 위해 % n 지정자가 있습니다 .

System.out.printf("baeldung%nline%nterminator");

위의 코드 스 니펫은 다음 출력을 생성합니다.

baeldung line terminator

% n 개의 세퍼레이터 의 printf ()는 자동으로 호스트 시스템의 기본 개행을 삽입한다 .

4. 부울 서식

부울 값의 형식을 지정하려면 % b 형식을 사용 합니다 . 다음과 같은 방식으로 작동합니다. 입력 값이 true이면 출력이 true 입니다. 그렇지 않으면 출력은 false 입니다.

따라서 다음과 같이하면됩니다.

System.out.printf("%b%n", null); System.out.printf("%B%n", false); System.out.printf("%B%n", 5.3); System.out.printf("%b%n", "random text");

그러면 다음을 볼 수 있습니다.

false FALSE TRUE true 

대문자 형식화에 % B 를 사용할 수 있습니다 .

5. 문자열 서식

간단한 문자열의 형식을 지정하려면 % s 조합을 사용합니다 . 또한 문자열을 대문자로 만들 수 있습니다.

printf("'%s' %n", "baeldung"); printf("'%S' %n", "baeldung");

출력은 다음과 같습니다.

'baeldung' 'BAELDUNG'

또한 최소 길이를 지정하기 위해 너비를 지정할 수 있습니다 .

printf("'%15s' %n", "baeldung");

이는 우리에게 다음을 제공합니다.

' baeldung'

문자열을 왼쪽 정렬해야하는 경우 ' -'플래그를 사용할 수 있습니다 .

printf("'%-10s' %n", "baeldung");

출력은 다음과 같습니다.

'baeldung '

Even more, we can limit the number of characters in our output by specifying a precision:

System.out.printf("%2.2s", "Hi there!");

The first ‘x' number in %x.ys syntax is the padding. ‘y' is the number of chars.

For our example here, the output is Hi.

6. Char Formatting

The result of %c is a Unicode character:

System.out.printf("%c%n", 's'); System.out.printf("%C%n", 's');

The capital letter C will uppercase the result:

s S

But, if we give it an invalid argument, then Formatter will throw IllegalFormatConversionException.

7. Number Formatting

7.1. Integer Formatting

The printf() method accepts all the integers available in the language; byte, short, int, long and BigInteger if we use %d:

System.out.printf("simple integer: %d%n", 10000L);

With the help of the ‘d' character, we'll have:

simple integer: 10000

In case we need to format our number with the thousands separator, we can use the ‘,'flag. And we can also format our results for different locales:

System.out.printf(Locale.US, "%,d %n", 10000); System.out.printf(Locale.ITALY, "%,d %n", 10000);

As we see, the formatting in the US is different than in Italy:

10,000 10.000

7.2. Float and Double Formatting

To format a float number, we'll need the ‘f' format:

System.out.printf("%f%n", 5.1473);

Which will output:

5.147300

Of course, the first thing that comes to mind is to control the precision:

System.out.printf("'%5.2f'%n", 5.1473);

Here we define the width of our number as 5, and the length of the decimal part is 2:

' 5.15'

Here we have one space padding from the beginning of the number to support the predefined width.

To have our output in scientific notation, we just use the ‘e' conversion character:

System.out.printf("'%5.2e'%n", 5.1473);

And the result is the following:

'5.15e+00'

8. Date and Time Formatting

For date and time formatting, the conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Let's explore the most common time and date formatting suffix characters with the examples.

Definitely, for more advanced formatting we can use DateTimeFormatter which has been available since Java 8.

8.1. Time Formatting

First, let's see the list of some useful suffix characters for Time Formatting:

  • ‘H', ‘M', ‘S' – characters are responsible for extracting the hours, minutes and second from the input Date
  • ‘L', ‘N' – to represent the time in milliseconds and nanoseconds accordingly
  • ‘p' – adds am/pm formatting
  • ‘z' – prints out the timezone offset

Now, let's say we wanted to print out the time part of a Date:

Date date = new Date(); System.out.printf("%tT%n", date);

The code above along with ‘%tT' combination produces the following output:

13:51:15

In case we need more detailed formatting, we can call for different time segments:

System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);

Having used ‘H', ‘M', and ‘S' we get:

hours 13: minutes 51: seconds 15

Though, listing date multiple times is a pain. Alternatively, to get rid of multiple arguments, we can use the index reference of our input parameter which is 1$ in our case:

System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date);

Here we want as an output the current time, am/pm, time in milliseconds, nanoseconds and the timezone offset:

13:51:15 pm 061 061000000 +0400

8.2. Date Formatting

Like time formatting, we have special formatting characters for date formatting:

  • ‘A' – prints out the full day of the week
  • ‘d' – formats a two-digit day of the month
  • ‘B' – is for the full month name
  • ‘m' – formats a two-digit month
  • ‘Y' – outputs a year in four digits
  • ‘y' – outputs the last two digits of the year

So, if we wanted to show the day of the week, followed by the month:

System.out.printf("%1$tA, %1$tB %1$tY %n", date);

Then using ‘A', ‘B', and ‘Y', we'd get:

Thursday, November 2018

To have our results all in numeric format, we can replace the ‘A', ‘B', ‘Y ‘ letters with ‘d', ‘m', ‘y':

System.out.printf("%1$td.%1$tm.%1$ty %n", date);

Which will result in:

22.11.18

9. Summary

이 기사에서는 PrintStream # printf 메서드를 사용하여 출력 형식을 지정 하는 방법에 대해 설명했습니다 . 일반적인 데이터 유형의 출력을 제어하는 ​​데 사용되는 다양한 형식 패턴을 살펴 보았습니다.

마지막으로 항상 그렇듯이 토론 중에 사용 된 코드는 GitHub에서 찾을 수 있습니다.