- 9.1. ChoiceFormat
- 9.2. MessageFormat
9.2. MessageFormat
MessageFormatは複数のメッセージを連結して1つのメッセージを連結するクラスです。連結する際、他のFormatクラスを使用してロケールや特定のフォーマットに従ったメッセージを作成することができます。まずもっとも簡単な使い方について説明します。
package sample; import java.text.MessageFormat; import java.util.Date; public class FormatTest { public static void main(String[] args) { MessageFormat format = new MessageFormat("ただいま{0}。天気は{1}です。"); Object[] parameters = {new Date(System.currentTimeMillis()), "晴れ"}; System.out.println(format.format(parameters)); } }
まずフォーマットを表す文字列を指定してMessageFormatインスタンスを作成します。その際、例のように
ただいま{0}。天気は{1}です。
と{0}{1}を使用してメッセージを作成します。{0}{1}の部分が他のメッセージと置き換わる(連結する)部分で、中括弧{}の中にインデックスを指定します。インデックスは必要なだけ増やすことができます。続いて置き換わるメッセージを作成します。配列として作成します。この配列のインデックスと、先ほどメッセージ中に指定した置き換わる箇所のインデックスが対応していると考えてください。つまり配列の0番目は{0}のところに、1番目は{1}のところに対応します。またメッセージはStringでならなければならないという制約は無く、JavaのObjectであればどのようなものでも指定できます。toString()メソッドの結果で置き換えられると考えてください。例では現在時刻を表すjava.util.Dateインスタンスと文字列を指定しています。作成した配列をformat()メソッドで指定すると、例えば
ただいま05/01/20 19:44。天気は晴れです。
というようなメッセージが作成されます。これがMessageFormatの基本的な使用方法です。
次に応用の使用方法について説明します。MessageFormatでは置き換えられる部分に関して、特定のFormatクラスを使用するように指定することができます。Formatクラスの指定はフォーマットにおいて置き換わる部分を指定する際、インデックスに続いて文字列で指定します。間はコンマで区切ります。例えば以下のようになります。
new MessageFormat("今日は{0,date}、時刻は{0,time}。天気は{1}です。");
dateを指定した場合には「DateFormat.getDateInstance()」で返されるフォーマットが、timeを指定した場合には「DateFormat.getTimeInstance()」で返されるフォーマットが適応されます。更に細かくフォーマットを指定することも可能で、例えば以下のようになります。
new MessageFormat("今日は{0,date,yyyy年MM月dd日}、時刻は{0,time}。天気は{1}です。");
これを実行すると以下のようなメッセージが生成されます。
今日は2005年01月20日、時刻は20:13:20。天気は晴れです。
以下に指定可能なフォーマット、サブフォーマット(更に細かく指定するフォーマット)と適応されるFormatインスタンスの一覧を示します。
フォーマット | サブフォーマット | 適応Formatインスタンス |
---|---|---|
number |
なし | NumberFormat.getInstance() |
integer | NumberFormat.getIntegerInstance() | |
currency | NumberFormat.getCurrencyInstance() | |
percent | NumberFormat.getPercentInstance() | |
任意フォーマット | new DecimalFormat(任意フォーマット) | |
date | なし | DateFormat.getDateInstance() |
shoft | DateFormat.getDateInstance(DateFormat.SHORT) | |
medium | DateFormat.getDateInstance(DateFormat.MEDIUM) | |
long | DateFormat.getDateInstance(DateFormat.LONG) | |
full | DateFormat.getDateInstance(DateFormat.FULL) | |
任意フォーマット | new SimpleDateFormat(任意フォーマット) | |
time | なし | DateFormat.getTimeInstance() |
shoft | DateFormat.getTimeInstance(DateFormat.SHORT) | |
medium | DateFormat.getTimeInstance(DateFormat.MEDIUM) | |
long | DateFormat.getTimeInstance(DateFormat.LONG) | |
full | DateFormat.getTimeInstance(DateFormat.FULL) | |
任意フォーマット | new SimpleDateFormat(任意フォーマット) | |
choice | 任意フォーマット | new ChoiceFormat(任意フォーマット) |
(練習問題1)
以下のコンソールアプリケーションを作成しなさい。
- 乱数を発生させ、その値を小数点以下3桁まで表示すること。
- またその値が0.5より大きいか小さいか表示すること。
- 以上をMessageFormatを用いて実現すること。