導入
オブジェクトごとに文字列出力を行う場合、フィールドの桁数が異なるなどで表示がそろわず、見た目が悪いことがある。これを改善する方法の1つとして、今回桁数をそろえた文字列の整形(フォーマット)を入門内容として学んだ。今回この文字列の整形を学ぶにあたり使用したのが、次に紹介するformat()メソッドとSystem.out.printf()メソッドだった。
format()メソッド
format() - Stringクラスのメソッド。public static String format(String format, Object... args)と定義されており、第一引数に書式指定文字列、第二引数以降に整形したいデータを渡す。この書式指定文字列は、専用の記法を用いて記述し、整形された文字列を返す(後述)。
System.out.printf()メソッド
printf() - PrintStreamクラスのメソッド。画面(標準出力)を管理する System.out を経由して、System.out.printf() の形で呼び出すことができる。APIではpublic PrintStream printf(String format, Object... args)で定義されており、format()メソッド同様、指定された書式文字列と引数を使用して、出力ストリームに書き込む。最大の違いは「整形した文字列をそのままコンソール(標準出力)に書き出す」点。
format()、printf()ともに引数が(String format, Object... args)となっており、第2引数からはObject...とピリオドを3つ並べる宣言の仕方をすることで可変長引数としていくつでも引数を渡せる仕組みになっている。
書式指定文字列
書式指定文字列を記述するときの最も簡単で基本となる記述方法は%型である。この記述から、必要に応じて
%[修飾][桁]型
のように修飾、桁の部分を指定することで桁数や配置を細かくコントロールできる。特に%記号の部分はプレースホルダ(place holder)と呼ばれ、先述したメソッドの第2引数以降で指定した具体的な値が順に流し込まれる。
1. 基本の型(変換文字)
パーセント記号(%)の直後、またはオプションの最後に記述する必須の文字。
| 変換文字 | 対象のデータ型 | 説明 | 例 |
|---|---|---|---|
%s |
文字列 (String) | 引数をそのまま文字列として出力 |
System.out.printf("%s", "Java"); → Java |
%d |
整数 (int, long など) | 10進数の整数として出力 |
System.out.printf("%d", 123); → 123 |
%f |
浮動小数点数 (double, float) | 10進数の浮動小数点数として出力 |
System.out.printf("%f", 3.14); → 3.140000 |
%b |
真偽値 (boolean) | true または false を出力 |
System.out.printf("%b", true); → true |
2. 表示桁数を制御するオプション
% と変換文字の間に指定することで、桁数を細かくコントロールできる。
① 幅(最小桁数)
出力する最小の文字幅を指定する。データが指定した幅に満たない場合はスペースで埋められる。
• %5d : 5桁の幅に右詰めで出力(例: 123)
② 精度(小数点以下の桁数など)
ピリオド(.)に続けて数値を指定する。主に浮動小数点数の小数点以下の桁数を指定する際によく使われ、自動的に四捨五入される。
• %.2f : 小数点以下2桁まで出力(例: 3.14)
• %8.2f : 全体で8桁(小数点含む)、小数点以下2桁で右詰め出力
3. 配置表示を制御するオプション
配置や符号の有無、カンマ区切りなどを指定する。
| フラグ | 説明 | 例 |
|---|---|---|
- |
左詰めにする(デフォルトは右詰め) |
%-5d → 123 |
0 |
空いたスペースをゼロで埋める |
%05d → 00123 |
, |
3桁ごとにカンマ(桁区切り)を入れる |
%,d → 1,234,567 |
+ |
正の数であっても符号(+ や -)を常に表示する |
%+d → +123 |
使用例
// 1. カンマ区切りとゼロ埋め
System.out.printf("売上: %,d 円%n", 1250000); // 表示: 売上: 1,250,000 円
System.out.printf("社員番号: %04d%n", 7); // 表示: 社員番号: 0007
// 2. 小数点以下の桁数指定(自動で四捨五入)
System.out.printf("円周率: %.2f%n", 3.141592); // 表示: 円周率: 3.14
// 3. 幅の指定(右詰め・左詰めによる整列)
System.out.printf("|%5s|%5d|%n", "りんご", 150); // 表示: | りんご| 150|
System.out.printf("|%-5s|%-5d|%n", "みかん", 80); // 表示: |みかん |80 |
// 4. String.formatを使った文字列の生成(画面出力せず変数に格納)
String message = String.format("結果は %b です。", true);