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

2.1. フォーマット規則

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

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

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

内部的には、 printf() はhttps://www.baeldung.com/java-string-formatter[java.util.Formatter]クラスを使用してフォーマット文字列を解析し、出力を生成します。その他のフォーマット文字列オプションはhttps://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax[Formatter Javadoc]にあります。

2.2. 変換文字

  • 変換文字 は必須であり、引数のフォーマット方法を決定します。変換文字は特定のデータ型に対してのみ有効です。一般的なものは次のとおりです。

  • 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

しかし、無効な引数を指定した場合、 Formatter IllegalFormatConversionException をスローします。

7. 数値の書式設定

7.1. 整数フォーマット

printf() メソッドは、言語で利用可能なすべての整数を受け入れます。 byte、short、int、long 、および __BigInteger if %d__を使用する場合:

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

'd' 文字を使用して、

simple integer: 10000
  • 桁区切り記号を使用して数値をフォーマットする必要がある場合は、 ʻ、' 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);

ここで、数値の width 5 と定義し、小数部分の長さは__2です。

' 5.15'

ここでは、事前定義された幅をサポートするために、数値の先頭から1つのスペースが埋め込まれています。

出力を科学的表記法で表現するには、 e変換文字 ** を使用するだけです。

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

そして結果は次のとおりです。

'5.15e+00'

8日付と時刻の書式設定

日付と時刻の書式設定の場合、 変換文字列は2つの文字のシーケンスです。つまり、 't' または 'T' の文字と変換サフィックス です。

例を使用して、最も一般的な日時のフォーマットのサフィックス文字を調べてみましょう。

確かに、より高度なフォーマットのために我々はJava 8以来利用可能であったhttps://www.baeldung.com/java-datetimeformatter[ DateTimeFormatter ]を使用することができます。

8.1. 時間フォーマット

まず、Time Formattingに役立つサフィックスの一覧を見てみましょう。

  • ** __ '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」を「 d」、「m」、「y」に置き換えます。

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

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

22.11.18

9概要

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

最後に、いつものように、ディスカッション中に使用されたコードはhttps://github.com/eugenp/tutorials/tree/master/core-java[GitHubについて]で見つけることができます。