1. 概要

この記事では、 java.util.Formatter クラスを使用したJavaでの文字列フォーマットについて説明します。このクラスは、レイアウトの位置合わせと配置をサポートします。

2. フォーマッターの使用方法

Cを覚えている printf? フォーマット Javaでの感じは非常に似ています。

Formatterformat()メソッドは、Stringクラスの静的メソッドを介して公開されます。 このメソッドは、テンプレート String と引数のリストを受け入れて、テンプレートに次のものを入力します。

String greetings = String.format(
  "Hello Folks, welcome to %s !", 
  "Baeldung");

結果のStringは次のとおりです。

"Hello Folks, welcome to Baeldung !"

テンプレートはStringであり、静的テキストと、特定の位置に配置する引数を示す1つ以上のフォーマット指定子が含まれています。

この場合、単一のフォーマット指定子%sがあり、対応する引数に置き換えられます。

3. フォーマット指定子

3.1. 一般的な構文

General、Character、、およびNumericタイプのフォーマット指定子の構文は次のとおりです。

%[argument_index$][flags][width][.precision]conversion

指定子argument_index、flag、width 、およびprecisionはオプションです。

  • arguments_indexの部分は整数i –引数リストのith引数をここで使用する必要があることを示します
  • flags は、出力形式を変更するために使用される文字のセットです。
  • width は、出力に書き込まれる最小文字数を示す正の整数です。
  • precision は、文字数を制限するために通常使用される整数であり、その特定の動作は変換によって異なります
  • 必須の部分です。 これは、引数のフォーマット方法を示す文字です。 特定の引数の有効な変換のセットは、引数のデータ型によって異なります

上記の例では、引数の数を明示的に指定する場合は、 1$および2$引数インデックスを使用して記述できます。

これらは両方ともそれぞれ最初と2番目の引数です:

String greetings = String.format(
  "Hello %2$s, welcome to %1$s !", 
  "Baeldung", 
  "Folks");

3.2. 日付/時刻表現の場合

%[argument_index$][flags][width]conversion

ここでも、 arguments_index、flags 、およびwidthはオプションです。

これを理解するために例を見てみましょう:

@Test
public void whenFormatSpecifierForCalendar_thenGotExpected() {
    Calendar c = new GregorianCalendar(2017, 11, 10);
    String s = String.format(
      "The date is: %tm %1$te,%1$tY", c);

    assertEquals("The date is: 12 10,2017", s);
}

ここでは、すべてのフォーマット指定子に対して、最初の引数が使用されるため、 1$になります。 ここで、2番目と3番目のフォーマット指定子の arguments_index をスキップすると、3つの引数を見つけようとしますが、3つのフォーマット指定子すべてに同じ引数を使用する必要があります。

したがって、最初の引数に arguments _index を指定しなくても問題ありませんが、他の2つには指定する必要があります。

ここでのフラグは2文字で構成されています。 ここで、最初の文字は常に‘t’または‘T’です。 2番目の文字は、カレンダーのどの部分を表示するかによって異なります。

この例では、最初のフォーマット指定子 tm は2桁でフォーマットされた月を示し、 te は月の日を示し、tYは4桁でフォーマットされた年を示します。

3.3. 引数なしのフォーマット指定子

%[flags][width]conversion

オプションのフラグおよびは、上記のセクションで定義されたものと同じです。

必要な変換は、出力に挿入されるコンテンツを示す文字または文字列です。 現在、これを使用して印刷できるのは、‘%’と改行‘n’のみです。

@Test
public void whenNoArguments_thenExpected() {
    String s = String.format("John scored 90%% in Fall semester");
 
    assertEquals("John scored 90% in Fall semester", s);
}

format()内で、‘%’ を印刷する場合は、‘%%’を使用してエスケープする必要があります。

4. コンバージョン

次に、変換から始めて、フォーマット指定子構文の詳細を詳しく調べてみましょう。 詳細はすべてFormatterjavadocsにあります。

上記の例で気付いたように、 Conversion の部分はすべての形式指定子で必要であり、いくつかのカテゴリに分類できます。

例を挙げて、それぞれを見てみましょう。

4.1. 全般的

任意の引数タイプに使用されます。 一般的な変換は次のとおりです。

  1. ‘b’または‘B’ブール値の場合
  2. ‘h’または‘H’HashCodeの場合
  3. の’または‘S’ String の場合、 null の場合は「null」、それ以外の場合はargを出力します。 toString()

次に、対応する変換を使用して、booleanおよびStringの値を表示しようとします。

@Test
public void givenString_whenGeneralConversion_thenConvertedString() {
    String s = String.format("The correct answer is %s", false);
    assertEquals("The correct answer is false", s);

    s = String.format("The correct answer is %b", null);
    assertEquals("The correct answer is false", s);

    s = String.format("The correct answer is %B", true);
    assertEquals("The correct answer is TRUE", s);
}

4.2. キャラクター

Unicode文字を表す基本タイプ(char、Character、byte、Byte、short、およびShort)に使用されます。 この変換は、タイプにも使用できます int整数いつ Character.isValidCodePoint(int) 戻り値真実彼らのために。

必要に応じて、‘c’または‘C’と書くことができます。

いくつかの文字を印刷してみましょう:

@Test
public void givenString_whenCharConversion_thenConvertedString() {
    String s = String.format("The correct answer is %c", 'a');
    assertEquals("The correct answer is a", s);

    s = String.format("The correct answer is %c", null);
    assertEquals("The correct answer is null", s);

    s = String.format("The correct answer is %C", 'b');
    assertEquals("The correct answer is B", s);

    s = String.format("The valid unicode character: %c", 0x0400);
    assertTrue(Character.isValidCodePoint(0x0400));
    assertEquals("The valid unicode character: Ѐ", s);
}

無効なコードポイントのもう1つの例を見てみましょう。

@Test(expected = IllegalFormatCodePointException.class)
public void whenIllegalCodePointForConversion_thenError() {
    String s = String.format("The valid unicode character: %c", 0x11FFFF);
 
    assertFalse(Character.isValidCodePoint(0x11FFFF));
    assertEquals("The valid unicode character: Ā", s);
}

4.3. 数値– 積分

これらは、Java整数型(byte、Byte、short、Short、intおよびInteger、long、Long、およびBigInteger)に使用されます。 このカテゴリには3つの変換があります。

  1. ‘d’ –10進数の場合
  2. ‘o’ –8進数の場合
  3. ‘X’または‘x’ –16進数の場合

これらのそれぞれを印刷してみましょう:

@Test
public void whenNumericIntegralConversion_thenConvertedString() {
    String s = String.format("The number 25 in decimal = %d", 25);
    assertEquals("The number 25 in decimal = 25", s);

    s = String.format("The number 25 in octal = %o", 25);
    assertEquals("The number 25 in octal = 31", s);

    s = String.format("The number 25 in hexadecimal = %x", 25);
    assertEquals("The number 25 in hexadecimal = 19", s);
}

4.4. 数値–浮動小数点

Java浮動小数点型に使用: float、Float、double、Double、および BigDecimal

  1. ‘e’または‘E’ コンピューター化された科学的記数法で10進数としてフォーマット
  2. ‘f’ 10進数としてフォーマット
  3. ‘g’または‘G’ 丸め後の精度値に基づいて、この変換はコンピューター化された科学的記数法または10進形式にフォーマットされます

浮動小数点数を出力してみましょう。

@Test
public void whenNumericFloatingConversion_thenConvertedString() {
    String s = String.format(
      "The computerized scientific format of 10000.00 "
      + "= %e", 10000.00);
 
    assertEquals(
      "The computerized scientific format of 10000.00 = 1.000000e+04", s);
    
    String s2 = String.format("The decimal format of 10.019 = %f", 10.019);
    assertEquals("The decimal format of 10.019 = 10.019000", s2);
}

4.5. その他の変換

  • 日付/時刻–日付または時刻をエンコードできるJavaタイプの場合:long、Long、Calendar、 日にちと TemporalAccessor。 このためには、前に見たように、接頭辞「t」または「T」を使用する必要があります
  • パーセント–リテラル‘%’(’\ u0025’)を出力します
  • ラインセパレーター–プラットフォーム固有のラインセパレーターを印刷します

簡単な例を見てみましょう。

@Test
public void whenLineSeparatorConversion_thenConvertedString() {
    String s = String.format("First Line %nSecond Line");
 
    assertEquals("First Line \n" + "Second Line", s);
}

5. フラグ

一般に、フラグは出力のフォーマットに使用されます。 一方、日付と時刻の場合は、セクション4の例で見たように、日付のどの部分を表示するかを指定するために使用されます。

いくつかのフラグが利用可能であり、そのリストはドキュメントにあります。

フラグの使用法を理解するために、フラグの例を見てみましょう。 ‘-‘ は、出力を左寄せとしてフォーマットするために使用されます。

@Test
public void whenSpecifyFlag_thenGotFormattedString() {
    String s = String.format("Without left justified flag: %5d", 25);
    assertEquals("Without left justified flag:    25", s);

    s = String.format("With left justified flag: %-5d", 25);
    assertEquals("With left justified flag: 25   ", s);
}

6. 精度

一般的な変換の場合、精度は、出力に書き込まれる文字の最大数です。 一方、fまたは、浮動小数点変換の精度は、小数点以下の桁数です。

最初のステートメントは浮動小数点数を使用した精度の例であり、2番目のステートメントは一般的な変換を使用したものです。

@Test
public void whenSpecifyPrecision_thenGotExpected() {
    String s = String.format(
      "Output of 25.09878 with Precision 2: %.2f", 25.09878);
 
    assertEquals("Output of 25.09878 with Precision 2: 25.10", s);

    String s2 = String.format(
      "Output of general conversion type with Precision 2: %.2b", true);
 
    assertEquals("Output of general conversion type with Precision 2: tr", s2);
}

7. 引数インデックス

前述のように、 arguments_indexは、引数リスト内の引数の位置を示す整数です。 1 $ は最初の引数を示し、 2$は2番目の引数を示します。

また、を使用して、位置によって引数を参照する別の方法があります ‘<‘(’\ u003c’) フラグ。これは、前のフォーマット指定子の引数が再利用されることを意味します。 たとえば、これら2つのステートメントは同じ出力を生成します。

@Test
public void whenSpecifyArgumentIndex_thenGotExpected() {
    Calendar c = Calendar.getInstance();
    String s = String.format("The date is: %tm %1$te,%1$tY", c);
    assertEquals("The date is: 12 10,2017", s);

    s = String.format("The date is: %tm %<te,%<tY", c);
    assertEquals("The date is: 12 10,2017", s);
}

8. フォーマッターのその他の使用方法

これまで、 Formatterクラスのformat()メソッドの使用を見てきました。 Formatter インスタンスを作成し、それを使用して format()メソッドを呼び出すこともできます。

Appendable、OutputStream、File、またはファイル名を渡すことでインスタンスを作成できます。 これに基づいて、フォーマットされた String は、それぞれ Appendable OutputStream Fileに格納されます。

でそれを使用する例を見てみましょう添付可能。 他の人と同じように使うことができます。

8.1. フォーマッタ追加可能の使用

S tringBuilderインスタンスsbを作成し、それを使用してフォーマッターを作成しましょう。 次に、 format()を呼び出して、Stringをフォーマットします。

@Test
public void whenCreateFormatter_thenFormatterWithAppendable() {
    StringBuilder sb = new StringBuilder();
    Formatter formatter = new Formatter(sb);
    formatter.format("I am writting to a %s Instance.", sb.getClass());
    
    assertEquals(
      "I am writting to a class java.lang.StringBuilder Instance.", 
      sb.toString());
}

9. 結論

この記事では、java.util.Formatterクラスによって提供されるフォーマット機能について説明しました。 String のフォーマットに使用できるさまざまな構文と、さまざまなデータ型に使用できる変換タイプを見てきました。

いつものように、私たちが見た例のコードは、Githubにあります。