目次へ

9. ChoiceFormat/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」を指定したい場合には「<」を使用します。「#」や「<」の後ろに空白を入れても構いませんが、それはメッセージの一部とみなされるので注意してください。「|」の前についても同様です。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp