整形の2つの方法
Java は、書式指定子(% のプレースホルダー)を含むテンプレートと、そこに差し込む値から文字列を整形します。入口は2つあり、どちらも同一の構文を共有します:
String.format(template, values...)は新しいStringを返します。System.out.printf(template, values...)は結果を直接出力します。
どちらも同じテキストを生成します。String.format はそれを返すので保存できます。printf はそれをコンソールに書き込みます。printf テンプレートの末尾にある %n に注目してください - これはプラットフォームに依存しない改行です(書式文字列では \n より優先して使いましょう)。
よく使う書式指定子
各指定子は % で始まり、どの種類の値を期待するかを示す文字で終わります:
日常的に使う3つは %s(任意の値、その toString 経由)、%d(整数)、%f(小数)です。リテラルのパーセント記号を出力するには %% を使います。間違った型を渡すと - 例えば %d に String を渡すと - 実行時に 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 を使いましょう。