金額のフォーマット
数値の中でも「金額」というのは非常によく使われるものの一つです。これも、専用のメソッドがNumberFormatに用意されています。getCurrencyInstanceというもので、インスタンスを取得する際、getInstanceの代りにこのメソッドを呼び出すと、金額の表示を簡単に得ることができます。
public static void main(String args[]) { int n = 1234567; NumberFormat format = NumberFormat.getCurrencyInstance(Locale.JAPAN); System.out.println(format.format(n)); }

例えば、日本円による表示であれば、このようにすると「¥1,234,567」といったテキストが表示されます。getCurrencyInstanceで、引数にLocale.JAPANというものを渡していますね。これは、日本のロケール情報を示すLocaleです。ドルによる表示をしたければ、Locale.USとすれば、「$1,234,567.00」といった表示になります。
金銭関係というのは、けっこう日本円以外のものも使うことがありますから、基本的な使い方ぐらいはしっかりと覚えておきたいものです。
テキストのフォーマット
この「決まったパターンに従ってフォーマットする」という考え方は、日時や数字といった値だけでなく、もっと汎用的なテキストでも利用することができます。これには、java.textパッケージのMessageFormatというクラスを利用します。
MessageFormatは、あらかじめ用意しておいたパターンの指定用テキストを元にメッセージを生成するためのものです。パターン指定のテキストには、「何番目のオブジェクトをどこにどう表示するか」といったことを指定しておきます。そして、パターンのテキストと共に、Object配列を渡すことで、そのObjectを使ってパターンを生成させます。
これは、文字で説明しただけだとなかなかイメージしにくいでしょう。簡単なサンプルを挙げて説明しましょう。
import java.text.MessageFormat; // ……(略)…… public static void main(String args[]) { Object[] obj = {new GregorianCalendar().getTime(),1234567}; String pattern = "本日は、{0,date,full}。現在の金額は、{1,number,currency}です。"; try { String msg = MessageFormat.format(pattern, obj); System.out.println(msg); } catch (IllegalArgumentException e) { System.out.println("メッセージの生成に失敗しました。"); } }

ここでは、「日付」と「金額を示す整数」の2つの値を元に、メッセージを生成し、表示させています。ここでは、DateとInteger(intをオブジェクトとして扱うときに用いられるクラス)を使ってメッセージを生成させるようにしてあります。まず、メッセージのパターンとなるものがどう作られているかを見てみましょう。
String pattern =
"本日は、{0,date,full}。現在の金額は、{1,number,currency}です。";
これが、パターンとなるテキストです。途中に、{}記号でくくった部分が2箇所ありますが、これが、Object配列を元にメッセージを生成している部分です。この{}では、渡されるObject配列から取り出すインデックス番号を指定します。配列の最初の要素をここに当てはめたければ、{0}とするわけです。
ただ値をはめ込むだけでなく、数字や日付を決まった形でフォーマットしてはめ込みたい場合には、{インデックス番号,種類,スタイル}というように、その値がどういう値で、どんなスタイルで表現するのかを指定できます。この種類とスタイルには、次のようなものが用意されています。
| 種類 | 意味 |
| number | 数値 |
| date | 日付 |
| time | 時刻 |
| choice | 選択項目(ChoiceFormatというクラスで作れる) |
| 種類 | スタイル |
| numberのスタイル | integer,currency,percent |
| date,timeのスタイル | short,medium,long,full |
これらを参考にしながら、先ほど作成されたメッセージの{}部分を見てみましょう。すると、次のような役割を果たしているものであることが分かります。
| 指定 | 意味 |
| {0,date,full} | 0番目のDateインスタンスを完全な形式でフォーマットする |
| {1,number,currency} | 1番目の数値を金額の形式でフォーマットする |
これで、生成されるメッセージがどういうものかは分かりましたね。では、MessageFormatに渡されるObject配列は、どのようになっていたでしょうか。
Object[] obj = {new GregorianCalendar().getTime(),1234567};
こんな値が渡されていました。MessageFormat.format(pattern, obj)というようにして、パターンのStringとObject配列を渡しformatするのです。これで生成されるメッセージは、こうなります。
本日は、2008年7月9日。現在の金額は、¥1,234,567です。
Dateとintの値が変われば、生成されるメッセージも変わります。このように、あらかじめ決まったテキストの文面に、必要に応じて値をはめ込んでメッセージを生成するような場合、このMessageFormatは非常に便利です。
