Java5の新機能を学ぶ - printf

2007/10/18

printfできるようになってるのね。

C言語のprintfのような書式付き出力がJavaでも導入されているようですね。
以前関わったJavaプロジェクトでは、printf相当のことを行うフォーマッタクラスを自前で用意した記憶があります。
「3」を「03」と出したいといった場面は多いですから、これが標準で使えるのは便利ですね。

printfメソッドが実装されているjava.util.FormatterのJavaDocには、

Java 言語の書式付き出力は、C の printf の影響を大きく受けています。書式文字列は C に似ていますが、Java 言語に対応し、その機能を活用するために、一部がカスタマイズされています。また、Java の書式は、C よりも厳密です。 たとえば、変換がフラグと互換性がない場合、例外がスローされます。C では、適用不可能なフラグは、無視されるだけです。このため、書式文字列は、C プログラマになじみのあるものになっていますが、C との完全な互換性を保っているわけではありません。

とあります。
C言語のprintfに似ているが、より便利に、より厳密になっており、C言語のそれとは完全に同じではないということか。

使ってみる

printfが実装されているのはjava.util.Formatterだが、通常はjava.io.PrintStreamやjava.lang.Stringにあるprintf()やformat()メソッドから使うことになるはず。以下の例ではだいたいSystem.out.printfを使ってます。

年月日をそれぞれ4ケタ2ケタ2ケタで出力
int y = 2007, m = 5, d = 7;
System.out.printf("%04d%02d%02d", y, m, d);
-> 20070507


普通は、第1引数に指定するフォーマット文の%○の順番と第2引数以降に指定する置換値の順番を合わせる必要があるが、フォーマット文中で1$や2$などのように「置換値の順番+'$'」と書けば、明示的に指定することも可能。
月/日/年の順で出力
System.out.printf("%2$02d/%3$02d/%1$04d", y, m, d);
-> 05/07/2007


日付も扱うことができる。%t○で時分秒などを指定する。
System.out.printf("%tp%<tI:%<tM:%<tS\n", new Date());
-> 午後07:10:26

<は1つ前の置換値と同じものを指定する、という意味。
ちなみに以下のようにロケールを英語圏に指定してやると、
System.out.printf(Locale.ENGLISH,
    "%tp%<tI:%<tM:%<tS\n", new Date());
-> pm07:10:26

というふうに午後がpmとなる。

String#format()
Stringにもformatメソッドがあり(printfはない)、同じように使える。
System.out.println(String.format("%02d", m));
-> 05


%sとFormattableインタフェース
カスタム書式を実装するには、java.util.Formattableというインタフェースを使う。
カスタム書式を実装するクラスでは、

  • Formattableをimplementsし、

  • カスタム書式処理を実装したformatToメソッドを定義


する。
使う側では、

  • フォーマット文で%sを指定


すると、formatToメソッドが呼ばれ、カスタム書式を得ることができる。
CustomFormatter cf = new CustomFormatter(xxx);
System.out.printf("%s", cf);
-> formatTo()の結果

Java | コメント(0) | トラックバック(0)
トラックバック
トラックバックURL:
コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)