System.out.printf の全体像
System.out.printf は「書式指定子(フォーマット)」を使って、値を整形して出力するためのメソッドです。プレースホルダ(例:%d, %s, %f)に値を順番に当てはめ、幅・桁数・左右寄せ・ゼロ埋め・符号・ロケール(区切り記号や小数点)まで細かく制御できます。改行は自動では付かないため、必要なら末尾に %n を入れます。戻り値は PrintStream(チェーン可能)で、String.format と同じ書式ルールを共有します。
基本の書式指定子
文字列・整数・小数の基本
System.out.printf("name=%s, age=%d, score=%.2f%n", "Taro", 20, 95.678);
// name=Taro, age=20, score=95.68
Java- %s: 文字列(toString の結果)
- %d: 整数(byte/short/int/long)
- %f: 小数(double/float、精度は小数点以下の桁数)
- %.2f: 小数点以下2桁に丸め
- %n: 改行(プラットフォーム依存の改行コードを安全に出す)
改行と % のエスケープ
System.out.printf("progress: 50%%%n");
// progress: 50%
Java- %%: 文字の「%」を出したいときのエスケープ
- %n: println の代わりに使う改行(\n ではなく %n が推奨)
フラグ・幅・精度の深掘り
幅・寄せ・ゼロ埋め・符号
System.out.printf("[%10s]%n", "OK"); // [ OK] 右寄せ(幅10)
System.out.printf("[%-10s]%n", "OK"); // [OK ] 左寄せ
System.out.printf("[%010d]%n", 123); // [0000000123] ゼロ埋め(幅10)
System.out.printf("[%+d] [% d]%n", 7, 7); // [+7] [ 7] 符号表示/符号の代わりにスペース
System.out.printf("[%10.2f]%n", 123.456); // [ 123.46] 幅10・小数2桁
Java- 幅(10 など): 全体の桁幅。足りない分をスペース(または 0)で埋める
- -(左寄せ): 指定幅で左寄せ
- 0(ゼロ埋め): 数値の空白埋めを 0 に
- + / 空白: 符号を常に表示/正数はスペース
グルーピング(桁区切り)・代替形式
System.out.printf("%,d%n", 1234567); // 1,234,567(ロケール依存)
System.out.printf("%#x%n", 255); // 0xff(代替形式:接頭辞付き16進)
System.out.printf("%#o%n", 8); // 010 (接頭辞付き8進)
Java- ,(グルーピング): 桁区切り(Locale に依存)
- #(代替形式): 16進/8進で接頭辞、浮動小数点で小数点強制など
引数位置の指定と再利用
複数の値を入れ替えたり再利用したりしたいときは「引数インデックス」を使います。
System.out.printf("%1$s-%2$d-%1$s%n", "ID", 42); // ID-42-ID
System.out.printf("%s: %<d, hex=%<x%n", 255); // 255: 255, hex=ff(%< は直前の引数再利用)
Java- %1$: 1番目の引数、%2$: 2番目の引数
- %<: 直前に使った引数を再利用
ロケール(言語・地域)による違い
数値の桁区切りや小数点、日付の表記はロケールに依存します。人に見せる出力では Locale を明示します。
import java.util.Locale;
System.out.printf(Locale.JAPAN, "%,.2f%n", 12345.678); // 12,345.68
System.out.printf(Locale.GERMANY, "%,.2f%n", 12345.678); // 12.345,68(小数点と区切りが逆)
Java- Locale.JAPAN/ENGLISH など: 文化圏の表記ルールに合わせて整形
- 国際化: ユーザー向けテキストなら Collator・DateTimeFormatter と合わせて使う
日付・時刻のフォーマット(t 系)
旧 API では %tX を使って日付/時刻を整形できます(新 API:java.time では DateTimeFormatter 推奨)。
java.util.Date now = new java.util.Date();
System.out.printf("%tY-%tm-%td %tH:%tM:%tS%n", now, now, now, now, now, now);
// 2025-12-17 20:18:05 のような出力(例)
System.out.printf("%1$ta %1$tF %1$tT%n", now);
// Wed 2025-12-17 20:18:05
Java- %tY/%tm/%td: 年4桁・月2桁・日2桁
- %tH/%tM/%tS: 時・分・秒(24時間)
- %tF/%tT: ISO拡張(YYYY-MM-DD / HH:MM:SS)
- %ta/%tA: 曜日の省略/完全名
よくある落とし穴と対策
改行忘れ・println との違い
printf は改行を付けません。最後に %n を入れるか、System.out.println を併用します。
型不一致の例外
指定子と引数の型が合わないと IllegalFormatConversionException になります。%d に小数、%f に整数などは不可です(数値ラッパー型は自動ボックス化に注意)。
浮動小数の丸めと表現
%.2f は丸め込み。金融用途では BigDecimal と桁・丸めモードを管理して、出力直前に文字列に変換してから %s を使う方が安全です。
ロケール未指定の思わぬ表記
サーバーの既定ロケールに影響されることがあります。人に見せる出力は Locale を明示しましょう。
例題で身につける
例 1: 明細表の整形(幅・寄せ・小数)
System.out.printf("%-12s %8d %12.2f%n", "Pen", 3, 120.0); // 品名左寄せ、数量右寄せ、金額小数2桁
System.out.printf("%-12s %8d %12.2f%n", "Notebook", 1, 350.0);
System.out.printf("%-12s %8s %12.2f%n", "TOTAL", "", 470.0);
Java例 2: グルーピングと符号
System.out.printf("amount=%(,d%n", -1234567); // (1,234,567) 負値を括弧表現、桁区切り
System.out.printf("amount=%+,d%n", 1234567); // +1,234,567 符号を常に表示
Java例 3: 引数再利用でラベルと値を両方に
System.out.printf("%s=%d, %<s(hex)=%<x%n", "val", 255); // val=255, val(hex)=ff
Java例 4: ロケール別の通貨風表示
var jp = java.util.Locale.JAPAN;
var us = java.util.Locale.US;
System.out.printf(jp, "JPY %,.0f%n", 1234567.0); // JPY 1,234,567
System.out.printf(us, "USD %,.2f%n", 1234567.0); // USD 1,234,567.00
Java仕上げのアドバイス(重要部分のまとめ)
printf は「見た目を仕様どおりに整える」ための強力な道具です。内容と型に合う指定子を選び、幅・寄せ・ゼロ埋め・符号・グルーピングで読みやすく整形する。改行は %n を忘れず、必要なら引数位置や再利用で複雑なレイアウトも簡潔に。人に見せる出力は Locale を明示し、日付は %t 系より java.time + DateTimeFormatter を推奨——この型が身につけば、ログもレポートも画面も「意図した形」で安定して出力できます。
