広告

Java : 書式文字列の一覧

Java には、%d%s といった書式文字列を使って、便利に文字列を生成する仕組みがあります。
本記事では、そんな書式文字列をコード例つきで網羅的にご紹介します。


概要

printf形式の文字列用のインタプリタ。 このクラスは、行揃えおよび水平配置レイアウト、数値、文字列、および日付/時刻データ用の共通書式、ロケール固有の出力をサポートします。

書式文字列とは、ある文字列の中に、数値や別の文字列などを便利に取り込む仕組みです。

final var str = "num = %d : str = %s".formatted(1234, "abc");
System.out.println(str); // "num = 1234 : str = abc"

上記コード例では、

num = %d : str = %s

の部分が書式文字列です。

  • %d のところに、1234 という数値
  • %s のところに、"abc" という文字列

を取り込んでいます。

C言語の経験があるかたは printf という関数でお世話になったかもしれません。
それと似た構文が Java言語でも使えます。

Java の書式文字列の基本は % ~ となります。
% のあとに、数値なら d、文字列なら s といった 変換指定子(conversion) が続きます。

本記事では、これ以上の細かい構文の解説は割愛します。
詳細は上記の Formatter API仕様 をご確認ください。

ここでは、コード例を中心にざっくりとご紹介していきます。

書式

Java で書式文字列を使うには、いくつか方法があります。

  • String.formatted
  • String.format
  • System.out.printf
  • Formatter

などなど。

本記事では、Java 15 で追加された String.formatted を主に使っています。
Java 15 より前のバージョンでは String.format をご使用ください。

// Java 15 以降
final var str1 = "num = %d : str = %s".formatted(1234, "abc");
System.out.println(str1); // "num = 1234 : str = abc"

// Java 15 より前
final var str2 = String.format("num = %d : str = %s", 1234, "abc");
System.out.println(str2); // "num = 1234 : str = abc"

インデックス指定

書式文字列にインデックスがない場合は、パラメータは指定した順番で変換されます。

final var str = "%s : %s : %s".formatted("a", "b", "c");
System.out.println(str); // "a : b : c"

インデックスの指定には $ を使います。
例えば 1$ とすると1番目のパラメータ、2$ とすると2番目のパラメータという指定ができます。

final var str1 = "%1$s : %2$s : %3$s".formatted("a", "b", "c");
System.out.println(str1); // "a : b : c"

final var str2 = "%3$s : %2$s : %1$s".formatted("a", "b", "c");
System.out.println(str2); // "c : b : a"

同じインデックスを複数指定することも可能です。
また、< で1つ前のインデックスを参照できます。

final var str1 = "%1$s : %1$s : %1$s".formatted("abc");
System.out.println(str1); // "abc : abc : abc"

final var str2 = "%1$s : %<s : %<s".formatted("abc");
System.out.println(str2); // "abc : abc : abc"

文字列

書式 オプション 説明 使用例
%s オブジェクトを文字列に変換します。
変換は Object.toString メソッドの結果です。
final var str1 = "%s : %s".formatted("abc", "XYZ");
System.out.println(str1); // "abc : XYZ"

final var str2 = "%s : %s".formatted(
        List.of(123, 456), Map.of("abc", 0.789));
System.out.println(str2); // "[123, 456] : {abc=0.789}"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str1 = "%5s".formatted("abc");
System.out.println(str1); // "  abc" (空白2つ)

final var str2 = "%2s".formatted("abc");
System.out.println(str2); // "abc"
精度 変換対象となる最大文字数です。
final var str1 = "%.3s".formatted("abcde");
System.out.println(str1); // "abc"

final var str2 = "%5.3s".formatted("abcde");
System.out.println(str2); // "  abc" (空白2つ)
- 左詰めです。
final var str = "%-5s".formatted("abc");
System.out.println(str); // "abc  " (空白2つ)
%S 小文字は大文字に変換されます。
それ以外は %s と同じです。
final var str1 = "%S : %S".formatted("abc", "XYZ");
System.out.println(str1); // "ABC : XYZ"

final var str2 = "%5S".formatted("abc");
System.out.println(str2); // "  ABC" (空白2つ)

final var str3 = "%-5S".formatted("abc");
System.out.println(str3); // "ABC  " (空白2つ)

文字

書式 オプション 説明 使用例
%c 文字へ変換します。
int型のコードポイントも変換できます。
final var str1 = "%c : %c".formatted('a', 'X');
System.out.println(str1); // "a : X"

// int型となるコードポイントにも使えます。
final var cp = Character.toCodePoint('\uD835', '\uDCBD');

final var str2 = "%x : %c".formatted(cp, cp);
System.out.println(str2); // "1d4bd : 𝒽"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%3c".formatted('a');
System.out.println(str); // "  a" (空白2つ)
- 左詰めです。
final var str = "%-3c".formatted('a');
System.out.println(str); // "a  " (空白2つ)
%C 小文字は大文字に変換されます。
それ以外は %c と同じです。
final var str1 = "%C : %C".formatted('a', 'X');
System.out.println(str1); // "A : X"

final var str2 = "%3C".formatted('a');
System.out.println(str2); // "  A" (空白2つ)

final var str3 = "%-3C".formatted('a');
System.out.println(str3); // "A  " (空白2つ)

整数

書式 オプション 説明 使用例
%d 10進数の整数へ変換します。
final var str1 = "%d : %d : %d".formatted(0, 123, -456);
System.out.println(str1); // "0 : 123 : -456"

final var str2 = "%d".formatted(0xff);
System.out.println(str2); // "255"

final var str3 = "%d".formatted(new BigInteger("123456789000"));
System.out.println(str3); // "123456789000"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%5d".formatted(123);
System.out.println(str); // "  123" (空白2つ)
0 足りない分を 0 で埋めます。
final var str = "%05d".formatted(123);
System.out.println(str); // "00123"
- 左詰めです。
final var str = "%-5d".formatted(123);
System.out.println(str); // "123  " (空白2つ)
+ 正の数の先頭に+記号をつけます。
final var str = "%+d : %+d".formatted(123, -456);
System.out.println(str); // "+123 : -456"
空白 正の数の先頭に1つの空白をつけます。
-記号と桁数を揃えたいときに使います。
final var str1 = "% d".formatted(123);
System.out.println(str1); // " 123" (空白1つ)

final var str2 = "% d".formatted(-456);
System.out.println(str2); // "-456"
, 桁数の大きい数に区切り文字を入れます。
final var str1 = "%d".formatted(123000000);
System.out.println(str1); // "123000000"

final var str2 = "%,d".formatted(123000000);
System.out.println(str2); // "123,000,000"
( 負の数は ( ) で囲います。
final var str1 = "%d : %d".formatted(123, -456);
System.out.println(str1); // "123 : -456"

final var str2 = "%(d : %(d".formatted(123, -456);
System.out.println(str2); // "123 : (456)"
%x 16進数の整数へ変換します。
負の数は符号なしの表現になります。
final var str1 = "%x : %x : %x".formatted(0x12ab, 255, -1);
System.out.println(str1); // "12ab : ff : ffffffff"

final var str2 = "%x".formatted(new BigInteger("305441741"));
System.out.println(str2); // "1234abcd"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%5x".formatted(0x123);
System.out.println(str); // "  123" (空白2つ)
0 足りない分を 0 で埋めます。
final var str = "%05x".formatted(0x123);
System.out.println(str); // "00123"
- 左詰めです。
final var str = "%-5x".formatted(0x123);
System.out.println(str); // "123  " (空白2つ)
# 先頭が 0x になります。
final var str = "%#x".formatted(0x123);
System.out.println(str); // "0x123"
%X 小文字は大文字に変換されます。
それ以外は %x と同じです。
final var str = "%X : %X : %X".formatted(0x12ab, 255, -1);
System.out.println(str); // "12AB : FF : FFFFFFFF"
%o 8進数の整数へ変換します。
負の数は符号なしの表現になります。
final var str1 = "%o : %o : %o : %o".formatted(7, 8, 9, 10);
System.out.println(str1); // "7 : 10 : 11 : 12"

final var str2 = "%o : %o".formatted(64, -1);
System.out.println(str2); // "100 : 37777777777"

final var str3 = "%o".formatted(new BigInteger("342391"));
System.out.println(str3); // "1234567"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%5o".formatted(83);
System.out.println(str); // "  123" (空白2つ)
0 足りない分を 0 で埋めます。
final var str = "%05o".formatted(83);
System.out.println(str); // "00123"
- 左詰めです。
final var str = "%-5o".formatted(83);
System.out.println(str); // "123  " (空白2つ)
# 先頭が 0 になります。
final var str = "%#o".formatted(83);
System.out.println(str); // "0123"

実数

書式 オプション 説明 使用例
%f 小数表記に変換します。
精度(小数部の桁数)のデフォルトは 6 です。
final var str1 = "%f : %f : %f".formatted(0.0, 1.23, -456.0);
System.out.println(str1); // "0.000000 : 1.230000 : -456.000000"

final var str2 = "%f : %f".formatted(1.2e-5, 1.234567e+6);
System.out.println(str2); // "0.000012 : 1234567.000000"

final var str3 = "%f".formatted(new BigDecimal("1.25"));
System.out.println(str3); // "1.250000"

final var str4 = "%f".formatted(Double.POSITIVE_INFINITY);
System.out.println(str4); // "Infinity"
精度 小数部の桁数を指定します。
final var str1 = "%.3f".formatted(0.0);
System.out.println(str1); // "0.000"

final var str2 = "%.3f : %.3f".formatted(0.12345, -678.9);
System.out.println(str2); // "0.123 : -678.900"

final var str3 = "%.10f".formatted(0.123456789);
System.out.println(str3); // "0.1234567890"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str1 = "%10f".formatted(0.123);
System.out.println(str1); // "  0.123000" (空白2つ)

final var str2 = "%10.3f".formatted(0.123);
System.out.println(str2); // "     0.123" (空白5つ)
0 足りない分を 0 で埋めます。
final var str1 = "%010f".formatted(0.123);
System.out.println(str1); // "000.123000"

final var str2 = "%010.3f".formatted(0.123);
System.out.println(str2); // "000000.123"
- 左詰めです。
final var str1 = "%-10f".formatted(0.123);
System.out.println(str1); // "0.123000  " (空白2つ)

final var str2 = "%-10.3f".formatted(0.123);
System.out.println(str2); // "0.123     " (空白5つ)
+ 正の数の先頭に+記号をつけます。
final var str = "%+f : %+f".formatted(123.0, -456.0);
System.out.println(str); // "+123.000000 : -456.000000"
空白 正の数の先頭に1つの空白をつけます。
-記号と桁数を揃えたいときに使います。
final var str1 = "% f".formatted(123.0);
System.out.println(str1); // " 123.000000" (空白1つ)

final var str2 = "% f".formatted(-456.0);
System.out.println(str2); // "-456.000000"
, 桁数の大きい数に区切り文字を入れます。
final var str1 = "%f".formatted(123000.0);
System.out.println(str1); // "123000.000000"

final var str2 = "%,f".formatted(123000.0);
System.out.println(str2); // "123,000.000000"
( 負の数は ( ) で囲います。
final var str1 = "%(f".formatted(123.0);
System.out.println(str1); // "123.000000"

final var str2 = "%(f".formatted(-456.0);
System.out.println(str2); // "(456.000000)"
# 常に小数点がつきます。
final var str1 = "%.0f".formatted(123.0);
System.out.println(str1); // "123"

final var str2 = "%#.0f".formatted(123.0);
System.out.println(str2); // "123."
%e 浮動小数点表記(10進数) に変換します。
精度(小数部の桁数)のデフォルトは 6 です。
final var str1 = "%e".formatted(0.0);
System.out.println(str1); // "0.000000e+00"

final var str2 = "%e : %e".formatted(0.123456789, -123456789.0);
System.out.println(str2); // "1.234568e-01 : -1.234568e+08"

final var str3 = "%e : %e".formatted(1.23e-3, 0x1.0p+6);
System.out.println(str3); // "1.230000e-03 : 6.400000e+01"

final var str4 = "%e".formatted(new BigDecimal("1.25"));
System.out.println(str4); // "1.250000e+00"

final var str5 = "%e".formatted(Double.POSITIVE_INFINITY);
System.out.println(str5); // "Infinity"
精度 小数部の桁数を指定します。
final var str1 = "%.3e".formatted(0.0);
System.out.println(str1); // "0.000e+00"

final var str2 = "%.3e : %.3e".formatted(0.123, -123456789.0);
System.out.println(str2); // "1.230e-01 : -1.235e+08"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str1 = "%14e".formatted(0.123);
System.out.println(str1); // "  1.230000e-01" (空白2つ)

final var str2 = "%14.3e".formatted(0.123);
System.out.println(str2); // "     1.230e-01" (空白5つ)
0 足りない分を 0 で埋めます。
final var str1 = "%014e".formatted(0.123);
System.out.println(str1); // "001.230000e-01"

final var str2 = "%014.3e".formatted(0.123);
System.out.println(str2); // "000001.230e-01"
- 左詰めです。
final var str1 = "%-14e".formatted(0.123);
System.out.println(str1); // "1.230000e-01  " (空白2つ)

final var str2 = "%-14.3e".formatted(0.123);
System.out.println(str2); // "1.230e-01     " (空白5つ)
+ 正の数の先頭に+記号をつけます。
final var str = "%+e : %+e".formatted(123.0, -456.0);
System.out.println(str); // "+1.230000e+02 : -4.560000e+02"
空白 正の数の先頭に1つの空白をつけます。
-記号と桁数を揃えたいときに使います。
final var str1 = "% e".formatted(123.0);
System.out.println(str1); // " 1.230000e+02" (空白1つ)

final var str2 = "% e".formatted(-456.0);
System.out.println(str2); // "-4.560000e+02"
( 負の数は ( ) で囲います。
final var str1 = "%(e".formatted(123.0);
System.out.println(str1); // "1.230000e+02"

final var str2 = "%(e".formatted(-456.0);
System.out.println(str2); // "(4.560000e+02)"
# 常に小数点がつきます。
final var str1 = "%.0e".formatted(0.0);
System.out.println(str1); // "0e+00"

final var str2 = "%#.0e".formatted(0.0);
System.out.println(str2); // "0.e+00"
%E 小文字は大文字に変換されます。
それ以外は %e と同じです。
final var str = "%E : %E".formatted(0.123, 0.456);
System.out.println(str); // "1.230000E-01 : 4.560000E-01"
%g 数の大きさによって、浮動小数点表記か小数表記に変換されます。
final var str1 = "%g : %g : %g".formatted(0.0, 1.23, -456.0);
System.out.println(str1); // "0.00000 : 1.23000 : -456.000"

final var str2 = "%g : %g".formatted(0.000123456, 0.0000123456);
System.out.println(str2); // "0.000123456 : 1.23456e-05"

final var str3 = "%g : %g".formatted(123456.0, 1234567.0);
System.out.println(str3); // "123456 : 1.23457e+06"

final var str4 = "%g".formatted(new BigDecimal("1.25"));
System.out.println(str4); // "1.25000"

final var str5 = "%g".formatted(Double.POSITIVE_INFINITY);
System.out.println(str5); // "Infinity"
精度 四捨五入処理後の結果として得られる絶対値の有効桁の合計数です。
final var str1 = "%.3g".formatted(0.0);
System.out.println(str1); // "0.00"

final var str2 = "%.3g : %.3g".formatted(1.23, -456.0);
System.out.println(str2); // "1.23 : -456"

final var str3 = "%.3g".formatted(1.23456e+6);
System.out.println(str3); // "1.23e+06"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str1 = "%9g".formatted(1.23);
System.out.println(str1); // "  1.23000" (空白2つ)

final var str2 = "%9.3g".formatted(1.23);
System.out.println(str2); // "     1.23" (空白5つ)

final var str3 = "%13g".formatted(1.23456e+6);
System.out.println(str3); // "  1.23456e+06" (空白2つ)

final var str4 = "%13.3g".formatted(1.23456e+6);
System.out.println(str4); // "     1.23e+06" (空白5つ)
0 足りない分を 0 で埋めます。
final var str1 = "%09g".formatted(1.23);
System.out.println(str1); // "001.23000"

final var str2 = "%09.3g".formatted(1.23);
System.out.println(str2); // "000001.23"

final var str3 = "%013g".formatted(1.23456e+6);
System.out.println(str3); // "001.23456e+06"

final var str4 = "%013.3g".formatted(1.23456e+6);
System.out.println(str4); // "000001.23e+06"
- 左詰めです。
final var str1 = "%-9g".formatted(1.23);
System.out.println(str1); // "1.23000  " (空白2つ)

final var str2 = "%-9.3g".formatted(1.23);
System.out.println(str2); // "1.23     " (空白5つ)
+ 正の数の先頭に+記号をつけます。
final var str1 = "%+g : %+g".formatted(123.0, -456.0);
System.out.println(str1); // "+123.000 : -456.000"
空白 正の数の先頭に1つの空白をつけます。
-記号と桁数を揃えたいときに使います。
final var str1 = "% g".formatted(123.0);
System.out.println(str1); // " 123.000" (空白1つ)

final var str2 = "% g".formatted(-456.0);
System.out.println(str2); // "-456.000"
, 桁数の大きい数に区切り文字を入れます。
final var str1 = "%g".formatted(123000.0);
System.out.println(str1); // "123000"

final var str2 = "%,g".formatted(123000.0);
System.out.println(str2); // "123,000"
( 負の数は ( ) で囲います。
final var str1 = "%(g".formatted(123.0);
System.out.println(str1); // "123.000"

final var str2 = "%(g".formatted(-456.0);
System.out.println(str2); // "(456.000)"
%G 小文字は大文字に変換されます。
それ以外は %g と同じです。
final var str = "%G : %G".formatted(1.23, 1.23456e+6);
System.out.println(str); // "1.23000 : 1.23456E+06"
%a 浮動小数点表記(16進数) に変換します。
final var str1 = "%a : %a".formatted(0.0, -0x1.23p1);
System.out.println(str1); // "0x0.0p0 : -0x1.23p1"

final var str2 = "%a : %a : %a".formatted(2.0, 4.0, 8.0);
System.out.println(str2); // "0x1.0p1 : 0x1.0p2 : 0x1.0p3"

final var str3 = "%a".formatted(Double.POSITIVE_INFINITY);
System.out.println(str3); // "Infinity"
精度 小数部の桁数を指定します。
final var str1 = "%a : %.3a".formatted(0x1.2p1, 0x1.2p1);
System.out.println(str1); // "0x1.2p1 : 0x1.200p1"

final var str2 = "%a : %.3a".formatted(0x1.23456p1, 0x1.23456p1);
System.out.println(str2); // "0x1.23456p1 : 0x1.234p1"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str1 = "%12a".formatted(0x1.2345p1);
System.out.println(str1); // "  0x1.2345p1" (空白2つ)

final var str2 = "%12.2a".formatted(0x1.2345p1);
System.out.println(str2); // "    0x1.23p1" (空白4つ)
0 足りない分を 0 で埋めます。
final var str1 = "%012a".formatted(0x1.2345p1);
System.out.println(str1); // "0x001.2345p1"

final var str2 = "%012.2a".formatted(0x1.2345p1);
System.out.println(str2); // "0x00001.23p1"
- 左詰めです。
final var str1 = "%-12a".formatted(0x1.2345p1);
System.out.println(str1); // "0x1.2345p1  " (空白2つ)

final var str2 = "%-12.2a".formatted(0x1.2345p1);
System.out.println(str2); // "0x1.23p1    " (空白4つ)
+ 正の数の先頭に+記号をつけます。
final var str = "%+a : %+a".formatted(2.0, -4.0);
System.out.println(str); // "+0x1.0p1 : -0x1.0p2"
空白 正の数の先頭に1つの空白をつけます。
-記号と桁数を揃えたいときに使います。
final var str1 = "% a".formatted(2.0);
System.out.println(str1); // " 0x1.0p1" (空白1つ)

final var str2 = "% a".formatted(-4.0);
System.out.println(str2); // "-0x1.0p2"
%A 小文字は大文字に変換されます。
それ以外は %a と同じです。
final var str = "%A : %A".formatted(0.0, -0x1.23p1);
System.out.println(str); // "0X0.0P0 : -0X1.23P1"

日時

日付・時刻の変換には %t~ および %T~ を使います。
%T~ は小文字が大文字で変換されます。

System.out.println(Locale.getDefault().toLanguageTag()); // ja-JP

final var date = LocalDate.of(2100, 1, 1);
System.out.println(date); // 2100-01-01

// 日本語だと、%t と %T は同じになることがあります。
final var str = "%tB : %TB".formatted(date, date);
System.out.println(str); // 1月 : 1月

// 英語の例です。
try (final var formatter = new Formatter(Locale.US)) {
    formatter.format("%tB : %TB", date, date);
    System.out.println(formatter); // January : JANUARY
}

日時の変換については DateTimeFormatter を使うのもおすすめです。

一般

一般に分類される書式は、後述する 時刻日付 の書式を使いやすくまとめたものです。

書式 オプション 説明 使用例
%tR %tH:%tM の書式と同じです。
final var time1 = LocalTime.of(6, 15);
System.out.println(time1); // 06:15

final var str1 = "%tR".formatted(time1);
System.out.println(str1); // "06:15"

final var time2 = LocalTime.of(14, 30);
final var str2 = "%tR".formatted(time2);
System.out.println(str2); // "14:30"

final var time3 = LocalTime.of(0, 0);
final var str3 = "%tR".formatted(time3);
System.out.println(str3); // "00:00"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%7tR".formatted(LocalTime.of(14, 30));
System.out.println(str); // "  14:30"  (空白2つ)
- 左詰めです。
final var str = "%-7tR".formatted(LocalTime.of(14, 30));
System.out.println(str); // "14:30  "  (空白2つ)
%tT %tH:%tM:%tS の書式と同じです。
オプションは %tR と同じです。
final var time1 = LocalTime.of(6, 15, 30);
System.out.println(time1); // 06:15:30

final var str1 = "%tT".formatted(time1);
System.out.println(str1); // "06:15:30"

final var time2 = LocalTime.of(14, 30, 59);
final var str2 = "%tT".formatted(time2);
System.out.println(str2); // "14:30:59"

final var time3 = LocalTime.of(0, 0, 0);
final var str3 = "%tT".formatted(time3);
System.out.println(str3); // "00:00:00"
%tr %tI:%tM:%tS %Tp の書式と同じです。
オプションは %tR と同じです。
final var time1 = LocalTime.of(6, 15, 30);
System.out.println(time1); // 06:15:30

final var str1 = "%tr".formatted(time1);
System.out.println(str1); // "06:15:30 午前"

final var time2 = LocalTime.of(14, 30, 59);
final var str2 = "%tr".formatted(time2);
System.out.println(str2); // "02:30:59 午後"

final var time3 = LocalTime.of(0, 0, 0);
final var str3 = "%tr".formatted(time3);
System.out.println(str3); // "12:00:00 午前"
%tD %tm/%td/%ty の書式と同じです。
オプションは %tR と同じです。
final var date = LocalDate.of(2030, 1, 15);
System.out.println(date); // 2030-01-15

final var str = "%tD".formatted(date);
System.out.println(str); // "01/15/30"
%tF %tY-%tm-%td の書式と同じです。
オプションは %tR と同じです。
final var date = LocalDate.of(2030, 1, 15);
System.out.println(date); // 2030-01-15

final var str = "%tF".formatted(date);
System.out.println(str); // "2030-01-15"
%tc %ta %tb %td %tT %tZ %tY の書式と同じです。
オプションは %tR と同じです。
final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo

final var dateTime = ZonedDateTime.of(
        LocalDate.of(2030, 1, 15),
        LocalTime.of(12, 30, 45),
        zoneId);
System.out.println(dateTime); // 2030-01-15T12:30:45+09:00[Asia/Tokyo]

final var str = "%tc".formatted(dateTime);
System.out.println(str); // "火 1月 15 12:30:45 JST 2030"

時刻

書式 オプション 説明 使用例
%tH 時・分・秒の を 00 - 23 の2桁で変換します。
final var time1 = LocalTime.of(6, 15);
System.out.println(time1); // 06:15

final var str1 = "%tH : %tM".formatted(time1, time1);
System.out.println(str1); // "06 : 15"

final var time2 = LocalTime.of(14, 30);
final var str2 = "%tH : %tM".formatted(time2, time2);
System.out.println(str2); // "14 : 30"

final var time3 = LocalTime.of(0, 0);
final var str3 = "%tH : %tM".formatted(time3, time3);
System.out.println(str3); // "00 : 00"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%4tH".formatted(LocalTime.of(14, 30));
System.out.println(str); // "  14"  (空白2つ)
- 左詰めです。
final var str = "%-4tH".formatted(LocalTime.of(14, 30));
System.out.println(str); // "14  "  (空白2つ)
%tI 時・分・秒の を 01 - 12 の2桁で変換します。
オプションは %tH と同じです。
final var time1 = LocalTime.of(6, 15);
System.out.println(time1); // 06:15

final var str1 = "%tI : %tM".formatted(time1, time1);
System.out.println(str1); // "06 : 15"

final var time2 = LocalTime.of(14, 30);
final var str2 = "%tI : %tM".formatted(time2, time2);
System.out.println(str2); // "02 : 30"

final var time3 = LocalTime.of(0, 0);
final var str3 = "%tI : %tM".formatted(time3, time3);
System.out.println(str3); // "12 : 00"
%tk 時・分・秒の を 0 - 23 で変換します。
オプションは %tH と同じです。
final var time1 = LocalTime.of(6, 15);
System.out.println(time1); // 06:15

final var str1 = "%tk : %tM".formatted(time1, time1);
System.out.println(str1); // "6 : 15"

final var time2 = LocalTime.of(14, 30);
final var str2 = "%tk : %tM".formatted(time2, time2);
System.out.println(str2); // "14 : 30"

final var time3 = LocalTime.of(0, 0);
final var str3 = "%tk : %tM".formatted(time3, time3);
System.out.println(str3); // "0 : 00"
%tl 時・分・秒の を 1 - 12 で変換します。
オプションは %tH と同じです。
final var time1 = LocalTime.of(6, 15);
System.out.println(time1); // 06:15

final var str1 = "%tl : %tM".formatted(time1, time1);
System.out.println(str1); // "6 : 15"

final var time2 = LocalTime.of(14, 30);
final var str2 = "%tl : %tM".formatted(time2, time2);
System.out.println(str2); // "2 : 30"

final var time3 = LocalTime.of(0, 0);
final var str3 = "%tl : %tM".formatted(time3, time3);
System.out.println(str3); // "12 : 00"
%tM 時刻の を 00 - 59 の2桁で変換します。
オプションは %tH と同じです。
final var time1 = LocalTime.of(12, 30);
System.out.println(time1); // 12:30

final var str1 = "%tH : %tM".formatted(time1, time1);
System.out.println(str1); // "12 : 30"

final var time2 = LocalTime.of(0, 0);
final var str2 = "%tH : %tM".formatted(time2, time2);
System.out.println(str2); // "00 : 00"
%tS 時刻の を 00 - 59 の2桁で変換します。
ただし、うるう秒で 60 になることがありえます。
オプションは %tH と同じです。
final var time1 = LocalTime.of(12, 30, 45);
System.out.println(time1); // 12:30:45

final var str1 = "%tH : %tM : %tS".formatted(time1, time1, time1);
System.out.println(str1); // "12 : 30 : 45"

final var time2 = LocalTime.of(0, 0, 0);
final var str2 = "%tH : %tM : %tS".formatted(time2, time2, time2);
System.out.println(str2); // "00 : 00 : 00"
%tL 時刻のミリ秒を 000 - 999 の3桁で変換します。
オプションは %tH と同じです。
final var time = LocalTime.of(0, 0, 0, 123000000);
System.out.println(time); // 00:00:00.123

final var str = "%tL".formatted(time);
System.out.println(str); // "123"
%tN 時刻のナノ秒を 000000000 - 999999999 の9桁で変換します。
オプションは %tH と同じです。
final var time = LocalTime.of(0, 0, 0, 123456789);
System.out.println(time); // 00:00:00.123456789

final var str = "%tN".formatted(time);
System.out.println(str); // "123456789"
%tp 時刻を午前/午後の表記へ変換します。表記は ロケール に依存します。
オプションは %tH と同じです。
System.out.println(Locale.getDefault().toLanguageTag()); // ja-JP

final var time1 = LocalTime.of(10, 0);
System.out.println(time1); // 10:00

final var str1 = "%tp : %Tp".formatted(time1, time1);
System.out.println(str1); // "午前 : 午前"

final var time2 = LocalTime.of(15, 0);
System.out.println(time2); // 15:00

final var str2 = "%tp : %Tp".formatted(time2, time2);
System.out.println(str2); // "午後 : 午後"

try (final var formatter = new Formatter(Locale.US)) {
    formatter.format("%tp : %Tp", time1, time1);
    System.out.println(formatter); // "am : AM"
}
%tz タイムゾーンをオフセット表記へ変換します。
オプションは %tH と同じです。
final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo

final var dateTime = ZonedDateTime.of(
        LocalDate.of(2100, 1, 1),
        LocalTime.of(12, 0),
        zoneId);
System.out.println(dateTime); // 2100-01-01T12:00+09:00[Asia/Tokyo]

final var str = "%tz".formatted(dateTime);
System.out.println(str); // "+0900"
%tZ タイムゾーンを省略表記へ変換します。
オプションは %tH と同じです。
final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo

final var dateTime = ZonedDateTime.of(
        LocalDate.of(2100, 1, 1),
        LocalTime.of(12, 0),
        zoneId);
System.out.println(dateTime); // 2100-01-01T12:00+09:00[Asia/Tokyo]

final var str = "%tZ".formatted(dateTime);
System.out.println(str); // "JST"
%ts 1970年1月1日00:00:00 UTC から経過した秒へ変換します。
オプションは %tH と同じです。
final var instant = Instant.ofEpochMilli(946684800000L);
System.out.println(instant); // 2000-01-01T00:00:00Z

final var str = "%ts".formatted(instant);
System.out.println(str); // "946684800"
%tQ 1970年1月1日00:00:00 UTC から経過したミリ秒へ変換します。
オプションは %tH と同じです。
final var instant = Instant.ofEpochMilli(946684800000L);
System.out.println(instant); // 2000-01-01T00:00:00Z

final var str = "%tQ".formatted(instant);
System.out.println(str); // "946684800000"

日付

書式 オプション 説明 使用例
%tB 月を ロケール 固有の表記へ変換します。
System.out.println(Locale.getDefault().toLanguageTag()); // ja-JP

final var date = LocalDate.of(2100, 1, 1);
System.out.println(date); // 2100-01-01

final var str = "%tB : %TB".formatted(date, date);
System.out.println(str); // "1月 : 1月"

try (final var formatter = new Formatter(Locale.US)) {
    formatter.format("%tB : %TB", date, date);
    System.out.println(formatter); // "January : JANUARY"
}
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%5tB".formatted(LocalDate.of(2100, 12, 1));
System.out.println(str); // "  12月" (空白2つ)
- 左詰めです。
final var str = "%-5tB".formatted(LocalDate.of(2100, 12, 1));
System.out.println(str); // "12月  " (空白2つ)
%tb
%th
月を ロケール 固有の省略表記へ変換します。
オプションは %tB と同じです。

%th は %tb と同じです。
System.out.println(Locale.getDefault().toLanguageTag()); // ja-JP

final var date = LocalDate.of(2100, 1, 1);
System.out.println(date); // 2100-01-01

final var str = "%tb : %Tb".formatted(date, date);
System.out.println(str); // "1月 : 1月"

try (final var formatter = new Formatter(Locale.US)) {
    formatter.format("%tb : %Tb", date, date);
    System.out.println(formatter); // "Jan : JAN"
}
%tA 曜日を ロケール 固有の表記へ変換します。
オプションは %tB と同じです。
System.out.println(Locale.getDefault().toLanguageTag()); // ja-JP

final var date = LocalDate.of(2100, 1, 1);
System.out.println(date); // 2100-01-01
System.out.println(date.getDayOfWeek()); // FRIDAY

final var str = "%tA : %TA".formatted(date, date);
System.out.println(str); // "金曜日 : 金曜日"

try (final var formatter = new Formatter(Locale.US)) {
    formatter.format("%tA : %TA", date, date);
    System.out.println(formatter); // "Friday : FRIDAY"
}
%ta 曜日を ロケール 固有の省略表記へ変換します。
オプションは %tB と同じです。
System.out.println(Locale.getDefault().toLanguageTag()); // ja-JP

final var date = LocalDate.of(2100, 1, 1);
System.out.println(date); // 2100-01-01
System.out.println(date.getDayOfWeek()); // FRIDAY

final var str = "%ta : %Ta".formatted(date, date);
System.out.println(str); // "金 : 金"

try (final var formatter = new Formatter(Locale.US)) {
    formatter.format("%ta : %Ta", date, date);
    System.out.println(formatter); // "Fri : FRI"
}
%tC 年を100で割った数値(最低2桁)へ変換します。
オプションは %tB と同じです。
final var date1 = LocalDate.of(900, 1, 1);
System.out.println(date1); // 0900-01-01

final var date2 = LocalDate.of(2150, 1, 1);
System.out.println(date2); // 2150-01-01

final var date3 = LocalDate.of(10000, 1, 1);
System.out.println(date3); // +10000-01-01

final var str = "%tC : %tC : %tC".formatted(date1, date2, date3);
System.out.println(str); // "09 : 21 : 100"
%tY 年を最低4桁の数値へ変換します。
オプションは %tB と同じです。
final var date1 = LocalDate.of(90, 1, 1);
System.out.println(date1); // 0090-01-01

final var date2 = LocalDate.of(2100, 1, 1);
System.out.println(date2); // 2100-01-01

final var date3 = LocalDate.of(10000, 1, 1);
System.out.println(date3); // +10000-01-01

final var str = "%tY : %tY : %tY".formatted(date1, date2, date3);
System.out.println(str); // "0090 : 2100 : 10000"
%ty 年の下2桁の数値へ変換します。
オプションは %tB と同じです。
final var date1 = LocalDate.of(1999, 1, 1);
System.out.println(date1); // 1999-01-01

final var date2 = LocalDate.of(2000, 1, 1);
System.out.println(date2); // 2000-01-01

final var date3 = LocalDate.of(2150, 1, 1);
System.out.println(date3); // 2150-01-01

final var str = "%ty : %ty : %ty".formatted(date1, date2, date3);
System.out.println(str); // "99 : 00 : 50"
%tj 年の何日目かを表す数値を 000 - 366 の3桁で変換します。例えば、1/31 は 31、2/1 は 32 となります。
オプションは %tB と同じです。
final var date1 = LocalDate.of(2100, 1, 1);
System.out.println(date1); // 2100-01-01

final var date2 = LocalDate.of(2100, 1, 31);
System.out.println(date2); // 2100-01-31

final var date3 = LocalDate.of(2100, 2, 1);
System.out.println(date3); // 2100-02-01

final var date4 = LocalDate.of(2100, 12, 31);
System.out.println(date4); // 2100-12-31

final var str = "%tj : %tj : %tj : %tj"
        .formatted(date1, date2, date3, date4);
System.out.println(str); // "001 : 031 : 032 : 365"
%tm 月を 01 - 12 の2桁で変換します。(ただし、13が太陰暦の特殊な値としてサポートされています)
オプションは %tB と同じです。
final var date1 = LocalDate.of(2100, 1, 1);
System.out.println(date1); // 2100-01-01

final var date2 = LocalDate.of(2100, 3, 31);
System.out.println(date2); // 2100-03-31

final var date3 = LocalDate.of(2100, 12, 1);
System.out.println(date3); // 2100-12-01

final var str = "%tm : %tm : %tm".formatted(date1, date2, date3);
System.out.println(str); // "01 : 03 : 12"
%td 月の何日目かを表す数値を 01 - 31 の2桁で変換します。
オプションは %tB と同じです。
final var date1 = LocalDate.of(2100, 1, 1);
System.out.println(date1); // 2100-01-01

final var date2 = LocalDate.of(2100, 1, 31);
System.out.println(date2); // 2100-01-31

final var date3 = LocalDate.of(2100, 2, 10);
System.out.println(date3); // 2100-02-10

final var str = "%td : %td : %td".formatted(date1, date2, date3);
System.out.println(str); // "01 : 31 : 10"
%te 月の何日目かを表す数値を 1 - 31 で変換します。
オプションは %tB と同じです。
final var date1 = LocalDate.of(2100, 1, 1);
System.out.println(date1); // 2100-01-01

final var date2 = LocalDate.of(2100, 1, 31);
System.out.println(date2); // 2100-01-31

final var date3 = LocalDate.of(2100, 2, 10);
System.out.println(date3); // 2100-02-10

final var str = "%te : %te : %te".formatted(date1, date2, date3);
System.out.println(str); // "1 : 31 : 10"

真偽値 (boolean)

書式 オプション 説明 使用例
%b 真偽値へ変換します。
null は false になります。
final var str = "%b : %b : %b".formatted(true, false, null);
System.out.println(str); // "true : false : false"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%6b".formatted(true);
System.out.println(str); // "  true" (空白2つ)
精度 変換対象となる最大文字数です。
final var str = "%.3b : %.3b".formatted(true, false);
System.out.println(str); // "tru : fal"
- 左詰めです。
final var str = "%-6b".formatted(true);
System.out.println(str); // "true  " (空白2つ)
%B 大文字で変換します。
それ以外は %b と同じです。
final var str = "%B : %B : %B".formatted(true, false, null);
System.out.println(str); // "TRUE : FALSE : FALSE"

ハッシュ・コード

書式 オプション 説明 使用例
%h オブジェクトをハッシュ・コード値へ変換します。
final var str = "%h : %h".formatted("xyz", 1234);
System.out.println(str); // "1d199 : 4d2"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%7h".formatted("xyz");
System.out.println(str); // "  1d199" (空白2つ)
精度 変換対象となる最大文字数です。
final var str1 = "%h".formatted("xyz");
System.out.println(str1); // "1d199"

final var str2 = "%.3h".formatted("xyz");
System.out.println(str2); // "1d1"
- 左詰めです。
final var str = "%-7h".formatted("xyz");
System.out.println(str); // "1d199  " (空白2つ)
%H 大文字で変換します。
それ以外は %h と同じです。
final var str = "%H : %H".formatted("xyz", 1234);
System.out.println(str); // "1D199 : 4D2"

%文字、改行文字

書式 オプション 説明 使用例
%% % の文字自体に変換します。
final var str = "%d%%".formatted(75);
System.out.println(str); // "75%"
変換結果の幅を指定します。
足りない分は空白で埋められます。
final var str = "%d%3%".formatted(75);
System.out.println(str); // "75  %"  (空白2つ)
- 左詰めです。
final var str = "%d%-3%".formatted(75);
System.out.println(str); // "75%  "  (空白2つ)
%n 改行文字に変換します。
System の lineSeparator メソッドで返されるプラットフォーム固有の文字です。
final var str = "%s%n%d".formatted("abc", 123);
System.out.println(str);

// 結果
// ↓
//abc
//123

まとめ

書式文字列を使うと、ある文字列をベースに、数値や別の文字列などを便利に取り込むことができます。
主な書式には次のものがあります。

  • %s : 文字列
  • %d : 整数
  • %f : 小数表記
  • %e : 浮動小数点表記

うまく使えばコードの可読性向上にもつながるので、有効に活用していきたいですね。


関連記事

ページの先頭へ