文字列を指定された書式文字列で整形する Formatter#format メソッドの使い方についてです。
Formatter#formatメソッドについて
Formatterクラスのformat()メソッドは以下の通りです。戻り値は自身のインスタンスです。
| メソッド | 説明 |
|---|---|
| format(String format, Object... args) | 第1引数に書式パターン、第2引数に値を指定。 |
| format(Locale l, String format, Object... args) | ロケールを指定可能。省略した場合はデフォルト。 |
また、java.lang.String、java.io.PrintStream、java.io.PrintWriterに実装されているformat()メソッドや、System.out.printfも内部ではFormatter#formatを呼び出していますので、同じように書式化が可能です。
import java.util.Formatter; public class FormatterSample { public static void main(String[] args) { Formatter fm = new Formatter(); fm.format("Hello %s!", "World"); System.out.println(fm); } } // 結果 Hello World!
Formatter (Java Platform SE 8)
書式の指定方法
書式は%を接頭辞で書式の開始文字として扱います。%を出力したい場合は%%と指定してください。大文字で書かれている書式は、変換の結果が大文字になります。String#toUpperCase()のメソッドを使用するのと同様です。
| 書式 | 説明 |
|---|---|
| s, S | 文字列リテラル |
| c, C | 文字リテラル |
| b, B | 真偽値 |
| h, H | ハッシュ値を16進数で表示 |
| d | 10進整数 |
| o | 8進整数 |
| x, X | 16進整数 |
| e, E | 浮動小数点 |
| f | 浮動小数点 |
| g, G | 浮動小数点 |
| a, A | 浮動小数点 |
| t, T | 日付および時刻変換文字の接頭辞 |
| n | 改行コード |
文字列
引数のtoString()が取得され、引数がFormattableを実装している場合、formatTo()が呼び出されます。引数が null の場合は null になります。
System.out.printf("1:%s 2:%S 3:%s 4:%s 5:%s", "hoge", "hoge", 1234.5, true, null); // 結果 1:hoge 2:HOGE 3:1234.5 4:true 5:null
真偽値
引数が boolean または Boolean の場合true | false、null の場合false、そうでない場合はtrueになります。
System.out.printf("1:%b 2:%B 3:%b 4:%b 5:%b", true, true, false, null, "hoge"); // 結果 1:true 2:True 3:false 4:false 5:true
ハッシュ値
オブジェクトのハッシュ値が取得され、引数が null の場合は null になります。
System.out.printf("1:%h 2:%H 3:%h 4:%h", "hoge", "hoge", true, null); // 結果 1:30f425 2:30F425 3:4cf 4:null
浮動小数点
浮動小数点の表示形式は以下の通りです。
float f = 1.2345F; System.out.printf("1:%e 2:%E 3:%f 4:%g 5:%G 6:%a 7:%A", f, f, f, f, f, f, f); // 結果 1:1.234500e+00 2:1.234500E+00 3:1.234500 4:1.23450 5:1.23450 6:0x1.3c0832p0 7:0X1.3C0832P0
日付/時刻変換
%tは接頭辞ですのでこれだけでは意味をなしません。%tの後に以下の書式を追加する必要があります。
| 書式 | 説明 |
|---|---|
| Y, y | 年を4桁, 年を2桁(00-99)で表現 |
| m | 月を2桁で表現(01-12) |
| d, e | 日を2桁(01-31), 日を1~2桁(1-31)で表現 |
| j | 年の何日目かを3桁で表現(001-366) |
Date date = new Date(); System.out.printf("年:%tY 年:%ty 月:%tm 日:%td 日:%te 年間経過日数:%tj", date, date, date, date, date, date); // 結果 年:2015 年:15 月:09 日:27 日:27 年間経過日数:270
| 書式 | 説明 |
|---|---|
| H, k | 24時間制の時を0埋め(00-23), 24時間制の時(0-23) |
| I, l | 12時間制の時を0埋め(01-12), 12時間制の時(1-12) |
| M | 分を0埋め(00-59) |
| S | 秒の0埋め(00-60) |
| L | ミリ秒の0埋め(000-999) |
Date date = new Date(); System.out.printf("時:%tH 時:%tk 3:%tI 4:%tl 5:%tM 6:%tS 7:%tL", date, date, date, date, date, date, date); // 結果 24時:22 24時:22 12時:10 12時:10 分:30 秒:45 ミリ秒:087
| 書式 | 説明 |
|---|---|
| R | %tH:%tMとして24時間制で書式設定された時刻 |
| T | %tH:%tM:%tSとして24時間制で書式設定された時刻 |
| r | %tI:%tM:%tS %Tpとして12時間制で書式設定された時刻 |
| D | "%tm/%td/%ty"として書式設定された日付 |
| F | %tY-%tm-%tdとして書式設定されたISO 8601に準拠した日付 |
| c | %ta %tb %td %tT %tZ %tYとして書式設定された日付および時間 |
System.out.printf("1:[%tR] 2:[%tT] 3:[%tr] 4:[%tD] 5:[%tF] 6:[%tc]", date, date, date, date, date, date); // 結果 1:[22:47] 2:[22:47:00] 3:[10:47:00 午後] 4:[09/27/15] 5:[2015-09-27] 6:[日 9 27 22:47:00 JST 2015]
出力する文字数の指定
| 書式 | 説明 |
|---|---|
| %n@ | 出力に書き込まれる最小文字数。 |
| %.n@ | 出力に書き込まれる最大文字数。浮動小数点では基数点以下の桁数。整数は使えない。 |
System.out.printf("1:[%5s] 2:[%-5s] 3:[%5d] 4:[%5f]", "hoge", "fuga", 1234, 1.234F); // 結果 1:[ hoge] 2:[fuga ] 3:[ 1234] 4:[1.234000] System.out.printf("1:[%.2s] 2:[%.2s] 3:[%.2f]", "hoge", "fuga", 1.234F); // 結果 1:[ho] 2:[fu] 3:[1.23]
関連書籍