Javaでのprintf()によるフォーマット

Javaでのprintf()を使用したフォーマット

1. 前書き

In this tutorial, we’ll demonstrate different examples of formatting with the printf()method

このメソッドは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つのフォーマット規則が含まれています。 最初のルールは、文字列引数のフォーマットに使用されます。 2番目のルールは、文字列の末尾に改行文字を追加します。

2.1. フォーマット規則

フォーマット文字列をさらに詳しく見てみましょう。 リテラルとフォーマット指定子で構成されます。 次の順序でFormat specifiers include flags, width, precision, and conversion characters

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

括弧内の指定子はオプションです。

内部的には、printf()java.util.Formatterクラスを使用してフォーマット文字列を解析し、出力を生成します。 追加のフォーマット文字列オプションは、Formatter Javadocにあります。

2.2. 変換文字

The conversion-character is required and determines how the argument is formatted。 変換文字は特定のデータ型でのみ有効です。 一般的なものは次のとおりです。

  • –文字列をフォーマットします

  • d –10進整数をフォーマットします

  • f –浮動小数点数をフォーマットします

  • t–日付/時刻値をフォーマットします

これらと他のいくつかについては、この記事の後半で説明します。

2.3. オプションの修飾子

The [flags] define standard ways to modify the outputであり、整数と浮動小数点数のフォーマットに最も一般的です。

The [width] specifies the field width for outputting the argument.出力に書き込まれる最小文字数を表します。

浮動小数点値を出力する場合はThe [.precision] specifies the number of digits of precision。 さらに、これを使用して、Stringから抽出する部分文字列の長さを定義できます。

3. 行区切り記号

To break the string into separate lines, we have a %n specifier

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

上記のコードスニペットは、次の出力を生成します。

example
line
terminator

The %n separator printf() will automatically insert the host system’s native line separator

4. ブールフォーマット

To format boolean values, we use the %b format。 これは次のように機能します。入力値が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. 文字列のフォーマット

To format a simple string, we’ll use the %s combination。 さらに、文字列を大文字にすることができます。

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

そして出力は次のとおりです。

'example'
'example'

また、最小の長さを指定するために、widthを指定できます。

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

それは私たちに与えます:

'       example'

文字列を左揃えにする必要がある場合は、 ‘-‘ flagを使用できます。

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

そして出力は次のとおりです。

'example  '

さらに、precisionを指定することで、出力の文字数を制限できます。

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

%x.ys構文の最初の‘x'番号は、パディングです。 ‘y'は文字数です。

ここでの例では、出力はHiです。

6. 文字のフォーマット

%cの結果はUnicode文字です。

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

大文字のCは、結果を大文字にします。

s
S

ただし、無効な引数を指定すると、FormatterIllegalFormatConversionExceptionをスローします。

7. 数値のフォーマット

7.1. 整数フォーマット

printf()メソッドは、言語で使用可能なすべての整数を受け入れます。 byte, short, int, longBigInteger %dを使用する場合):

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

‘d'文字を使用すると、次のようになります。

simple integer: 10000

to format our number with the thousands separator, we can use the ‘,' flag.が必要な場合は、結果をさまざまなロケールに合わせてフォーマットすることもできます。

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

ご覧のとおり、米国のフォーマットはイタリアのフォーマットとは異なります。

10,000
10.000

7.2. フロートおよびダブルフォーマット

浮動小数点数をフォーマットするには、「f」フォーマットが必要です。

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

どれが出力されます:

5.147300

もちろん、最初に頭に浮かぶのは、precisionを制御することです。

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

ここでは、数値のwidth5として定義し、小数部の長さは2:です。

' 5.15'

ここでは、定義済みの幅をサポートするために、番号の先頭から1つのスペースパディングがあります。

出力in scientific notation, we just use the ‘e' conversion characterを取得するには:

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

結果は次のとおりです。

'5.15e+00'

8. 日付と時刻のフォーマット

日付と時刻のフォーマットについては、the conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix。 例を使用して、最も一般的な時刻と日付のフォーマットのサフィックス文字を調べてみましょう。

間違いなく、より高度なフォーマットには、Java 8以降で使用可能なDateTimeFormatterを使用できます。

8.1. 時間フォーマット

まず、タイムフォーマットに役立つサフィックス文字のリストを見てみましょう。

  • 入力Dateからの‘H', ‘M', ‘S'  – characters are responsible for extracting the hours, minutes and second

  • ‘L', ‘N' –それに応じてミリ秒とナノ秒で時間を表します

  • ‘p' –午前/午後の書式を追加

  • ‘z' –タイムゾーンオフセットを出力します

ここで、Dateの時間部分を出力したいとします。

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

上記のコードと‘%tT'の組み合わせにより、次の出力が生成されます。

13:51:15

より詳細な書式設定が必要な場合は、異なる時間セグメントを呼び出すことができます。

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

‘H'‘M'、および‘S'を使用すると、次のようになります。

hours 13: minutes 51: seconds 15

ただし、date を複数回リストするのは面倒です。 または、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);

ここでは、出力として現在の時間、am / pm、ミリ秒単位の時間、ナノ秒、およびタイムゾーンオフセットが必要です。

13:51:15 pm 061 061000000 +0400

8.2. 日付のフォーマット

時間の書式設定と同様に、日付の書式設定用の特別な書式設定文字があります。

  • ‘A' –曜日全体を出力します

  • ‘d' –月の2桁の日をフォーマットします

  • ‘B' –は完全な月の名前です

  • ‘m' –2桁の月をフォーマットします

  • ‘Y' –年を4桁で出力します

  • ‘y' –年の下2桁を出力します

したがって、曜日を表示し、その後に月を表示する場合:

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

次に、‘A'‘B'、および‘Y'を使用すると、次のようになります。

Thursday, November 2018

結果をすべて数値形式にするために、「A', ‘B', ‘Y」の文字を「d', ‘m', ‘y'」に置き換えることができます。

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

結果は次のようになります。

22.11.18

9. 概要

この記事では、PrintStream#printfメソッドを使用して出力をフォーマットする方法について説明しました。 一般的なデータ型の出力を制御するために使用されるさまざまな形式パターンを調べました。

最後に、いつものように、ディスカッション中に使用されたコードはover on GitHubで見つけることができます。