java.util.Formatterのガイド
1. 概要
この記事では、 java.util.Formatter クラスを使用したJavaでの文字列フォーマットについて説明します。このクラスは、レイアウトの位置合わせと配置をサポートします。
2. フォーマッターの使用方法
Cを覚えている
Formatterのformat()メソッドは、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. 全般的
任意の引数タイプに使用されます。 一般的な変換は次のとおりです。
- ‘b’または‘B’ –ブール値の場合
- ‘h’または‘H’ – HashCodeの場合
- の’または‘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. キャラクター
必要に応じて、‘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. 数値– 積分
- ‘d’ –10進数の場合
- ‘o’ –8進数の場合
- ‘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
- ‘e’または‘E’ –コンピューター化された科学的記数法で10進数としてフォーマット
- ‘f’ –10進数としてフォーマット
- ‘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のにあります。