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つのフォーマットルールが含まれています。 最初のルールは、文字列引数をフォーマットするために使用されます。 2番目のルールは、文字列の最後に改行文字を追加します。

2.1. フォーマットルール

フォーマット文字列をもっと詳しく見てみましょう。 リテラルとフォーマット指定子で構成されています。 フォーマット指定子には、フラグ、幅、精度、および変換文字が次の順序で含まれます。

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

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

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

2.2. 変換文字

Conversion-character は必須であり、引数のフォーマット方法を決定します。

変換文字は、特定のデータ型に対してのみ有効です。 一般的なものは次のとおりです。

  • sは文字列をフォーマットします。
  • dは10進整数をフォーマットします。
  • fは浮動小数点数をフォーマットします。
  • tは日付/時刻の値をフォーマットします。

これらと他のいくつかについては、チュートリアルの後半で説明します。

2.3. オプションの修飾子

[flags]は、出力を変更する標準的な方法を定義し、整数と浮動小数点数のフォーマットに最も一般的です。

[width]は、引数を出力するためのフィールド幅を指定します。出力に書き込まれる最小文字数を表します。

[.precision]は、浮動小数点値を出力するときの精度の桁数を指定します。 さらに、これを使用して、Stringから抽出するサブストリングの長さを定義できます。

3. ラインセパレーター

文字列を別々の行に分割するために、%n指定子があります。

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

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

baeldung
line
terminator

%n Separator 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'

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

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

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

'       baeldung'

文字列を左揃えにする必要がある場合は、 –フラグを使用できます。

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

これは出力です:

'baeldung  '

さらに、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 long [X135X ]、および BigInteger %d を使用する場合:

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

d 文字を使用すると、次の結果が得られます。

simple integer: 10000

千単位の区切り文字で数値をフォーマットするためにが必要な場合は、フラグを使用できます。また、さまざまなロケールの結果をフォーマットすることもできます。

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

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

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

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

' 5.15'

ここでは、事前定義された幅をサポートするために、数値の先頭から1スペースのパディングがあります。

出力を科学的記数法で表すには、e変換文字を使用します。

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

そしてこれが私たちの結果です:

'5.15e+00'

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

日付と時刻のフォーマットの場合、変換文字列は、tまたはT文字と変換サフィックスの2文字のシーケンスです。

例を使用して、最も一般的な時刻と日付のフォーマット接尾辞文字を調べてみましょう。

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

8.1. 時間フォーマット

まず、時間の書式設定に役立つサフィックス文字のリストを見てみましょう。

  • H、M、S文字は、入力日付から時間、分、秒を抽出する役割を果たします。
  • 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を複数回リストするのは面倒です。

または、を使用して複数の引数を削除するには、入力パラメーターのインデックス参照を使用できます。この場合はの場合は1$です。

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

ここでは、現在の時刻、午前/午後、ミリ秒とナノ秒単位の時刻、およびタイムゾーンオフセットを出力として使用します。

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の文字をdmに置き換えることができます。 y

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

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

22.11.18

9. 結論

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

最後に、いつものように、ディスカッション中に使用されたコードは、GitHubにあります。