9. ChoiceFormat/MessageFormat
- 9.1. ChoiceFormat
- 9.2. MessageFormat
これまで数値を整形して表示するためのクラスとしてjava.text.NumberFormat, java.text.DecimalFormat、日時を整形して表示するためのクラスとしてjava.text.DateFormatを説明してきました。これらのクラスはいずれもjava.text.Formatクラスを先祖に持ちますが、Formatクラスは日付・メッセージ・数値などロケールに依存する情報を整形する基底クラスです。他にFormatクラスの子孫のクラスとして、java.text.ChoiceFormatとjava.text.MessageFormatがあります。この章ではこれら2つのクラスを説明します。
9.1. ChoiceFormat
ChoiceFormatクラスもDecimalFormatクラスと同じくNumberFormatクラスを継承したクラスで、数値データを整形して表示するクラスです。ただし数値データを数値として表示するのではなく、数値の値に応じて全く別のメッセージを表示させます。例えば値が0未満なら「負の数」、0以上なら「正の数」と表示させることができます。以下のプログラムは0未満なら「負の数」、0以上なら「正の数」を表示するものです。
package sample; import java.text.ChoiceFormat; public class FormatTest { public static void main(String[] args) { double[] limits = {-1, 0}; String[] messages = {"負の数", "正の数"}; ChoiceFormat format = new ChoiceFormat(limits, messages); double[] nums = {-1, 0, 1, -8, 3}; for(int i = 0; i < nums.length; i++) { System.out.println(nums[i] + "は" + format.format(nums[i])); } } }
ChoiceFormatには2種類コンストラクタがあるのですが、ここで用いているものの第1引数には閾値を表すdoubleの配列、第2引数には対応するメッセージの配列を指定します。閾値と表示メッセージの関係ですが、配列のi番目のメッセージは、
閾値配列[i] <= 数値 < 閾値配列[i+1]
の場合に表示されます。つまり例の場合、数値xが
- -1 <= x < 0の場合、「負の数」
- 0 <= x の場合、「正の数」
と表示されます。この範囲以外の数値の場合ですが、その場合には大きい場合には配列の最後のメッセージ、小さい場合には最初のメッセージが表示されます。つまり-1より小さい場合には「負の数」と表示されます。なお実際に数値に応じてメッセージを表示させる場合には「format()」メソッドを使用します。
厳密にある値の時だけ特定のメッセージを表示したい場合が考えられます。例えば0の時は「0」と表示し、0より大きい場合は「正の数」と表示したい場合です。こういう場合には以下のようにします。
double[] limits = {-1, 0, ChoiceFormat.nextDouble(0)}; String[] messages = {"負の数", "0", "正の数"}; ChoiceFormat format = new ChoiceFormat(limits, messages);
「nextDouble()」メソッドは、引数で指定された値よりも大きい最小のdoubleを返します。ChoiceFormatの閾値はdoubleで指定しますので、このメソッドを活用することにより特定の値で特定のメッセージを表示させることができます。nextDouble()メソッドとは反対に、引数で指定された値よりも小さい最大のdoubleを返すpreviousDoubleメソッドもあります。
最後にChoiceFormatの2つ目のコンストラクタについて説明します。こちらのコンストラクタの引数は文字列1つで、文字列で閾値と表示するメッセージを指定します。以下は先ほどの例と同じ動作をするChoiceFormatを作成した例です。
ChoiceFormat format = new ChoiceFormat("-1#負の数| 0#0| 0<正の数");
閾値とメッセージの組み合わせて指定し、組み合わせの境には「|」を入れます。「|」の後に空白を入れても入れなくても構いません。無視されます。閾値とメッセージの境は「#」ですが、もし閾値に「ChoiceFormat.nextDouble」を指定したい場合には「<」を使用します。「#」や「<」の後ろに空白を入れても構いませんが、それはメッセージの一部とみなされるので注意してください。「|」の前についても同様です。