Menu

Java の文字列フォーマット: String.format、printf、書式指定子

Java で String.format と printf を使って文字列を整形する方法 - 数値・パディング・小数の書式指定子、そしてテキストブロックと formatted メソッド。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

整形の2つの方法

Java は、書式指定子% のプレースホルダー)を含むテンプレートと、そこに差し込む値から文字列を整形します。入口は2つあり、どちらも同一の構文を共有します:

  • String.format(template, values...) は新しい String を返します。
  • System.out.printf(template, values...) は結果を直接出力します。

どちらも同じテキストを生成します。String.format はそれを返すので保存できます。printf はそれをコンソールに書き込みます。printf テンプレートの末尾にある %n に注目してください - これはプラットフォームに依存しない改行です(書式文字列では \n より優先して使いましょう)。

よく使う書式指定子

各指定子は % で始まり、どの種類の値を期待するかを示す文字で終わります:

日常的に使う3つは %s(任意の値、その toString 経由)、%d(整数)、%f(小数)です。リテラルのパーセント記号を出力するには %% を使います。間違った型を渡すと - 例えば %dString を渡すと - 実行時に IllegalFormatConversionExceptionスローされます

小数桁の制御

%f はデフォルトで小数6桁になり、これは望むものであることはまれです。精度を固定するには f の前に .N を置きます(値は丸められます):

大きな数値の桁区切りにはカンマフラグを追加します:

幅とパディング

% と型を表す文字の間に置いた数値は最小フィールド幅を設定し、列が揃うようにスペースで埋めます。先頭の - は左揃え、先頭の 0 は数値をゼロで埋めます:

これこそが、整形された表や揃ったレポートを読みやすくするものです:

%-8s は名前を幅8の列で左揃えにし、%5d はスコアを幅5の列で右揃えにするので、桁数に関係なく数値が揃います。

引数の順序

デフォルトでは、指定子は値を左から右へ消費します。N$(1始まりのインデックス)を使えば値を繰り返したり順序を変えたりでき、同じ値が2回現れるときに便利です:

%1$s は両方とも最初の引数を参照するので、echo が2回出力されます。

formatted() メソッド

Java 15 以降、すべての文字列に formatted インスタンスメソッドがあります - String.format と同じエンジンを、テンプレートに対するメソッド呼び出しとして書いたものです:

より大きな整形済み出力を組み立てるとき、テキストブロック(三重引用符の複数行文字列)と特に相性がよいです。

String.format を使わないほうがよい場合

単純な一度きりの連結なら、+ による素朴な連結のほうが明快で速いです:

String greeting = "Hi, " + name + "!";   // simpler than String.format here

固定の小数桁、パディング、揃え、桁区切りといった本当の整形が必要なときに String.format / printf を使いましょう。いくつかの値を貼り合わせるだけのときではありません。

次: 演算子

整形は値をテキストに変えます。そもそもその値を計算するには、Java の演算子 - 算術、比較、論理 - が必要です。それが次のページです。

よくある質問

Java で文字列を整形するにはどうすればよいですか?

String.format(template, values...) を使います。これは各書式指定子を値で置き換えた新しい文字列を返します: String.format("%s is %d", name, age)。文字列を組み立てる代わりに直接出力したい場合は、同じテンプレートで System.out.printf(...) を使います。Java 15 以降は template.formatted(values...) も呼び出せます。

Java で数値を小数2桁に整形するにはどうすればよいですか?

%.2f 指定子を使います: String.format("%.2f", 3.14159)"3.14" を生成します。ドットの後ろの数字が保持する小数桁数で、値は丸められます。桁区切りにはカンマフラグを付けます: %,.2f"1,234.57" になります。

Java における String.format と printf の違いは何ですか?

両者はまったく同じ書式指定子を使います。String.format(...) は整形済みのテキストを新しい String として返し、保存したり受け渡したりできます。System.out.printf(...) は整形済みテキストを標準出力に直接書き込み、有用な値は返しません。文字列を組み立てるなら String.format、出力するなら printf を使いましょう。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める