Java プラットフォーム 1.2

java.text
クラス MessageFormat

java.lang.Object
  |
  +--java.text.Format
        |
        +--java.text.MessageFormat

public class MessageFormat
extends Format

MessageFormat は、連結されたメッセージを、言語に依存しない方法で構築するためのものです。エンドユーザ用に表示するメッセージは、この方法で構築してください。

MessageFormat は、1 組のオブジェクトをフォーマットし、フォーマットした文字列をパターンの適切な場所に挿入します。

注: MessageFormat が他の Format クラスと異なる点は、MessageFormat オブジェクトを (MessageFormat スタイルのファクトリメソッドではなく) そのコンストラクタの 1 つで作成するということです。MessageFormat ではロケールに対して複雑なセットアップが必要ないので、ファクトリメソッドは必要ありません。実際、MessageFormat に、ロケール固有の動作は一切実装されていません。

この使用例を次に示します。

 Object[] arguments = {
     new Integer(7),
     new Date(System.currentTimeMillis()),
     "a disturbance in the Force"
 };

 String result = MessageFormat.format(
     "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
     arguments);

 output: At 12:30 PM on Jul 3, 2053, there was a disturbance
           in the Force on planet 7.

 
一般に、メッセージフォーマットはリソースから与えられ、引数は実行時に動的に設定されます。

例 2:

 Object[] testArgs = {new Long(3), "MyDisk"};

 MessageFormat form = new MessageFormat(
     "The disk ¥"{1}¥" contains {0} file(s).");

 System.out.println(form.format(testArgs));

 // output, with different testArgs
 output: The disk "MyDisk" contains 0 file(s).
 output: The disk "MyDisk" contains 1 file(s).
 output: The disk "MyDisk" contains 1,273 file(s).
 

このパターンは次の形式です

 messageFormatPattern := string ( "{" messageFormatElement "}" string )*

 messageFormatElement := argument { "," elementFormat }

 elementFormat := "time" { "," datetimeStyle }
                | "date" { "," datetimeStyle }
                | "number" { "," numberStyle }
                | "choice" { "," choiceStyle }

 datetimeStyle := "short"
                  | "medium"
                  | "long"
                  | "full"
                  | dateFormatPattern

 numberStyle := "currency"
               | "percent"
               | "integer"
               | numberFormatPattern

 choiceStyle := choiceFormatPattern
 
elementFormat がない場合、引数は文字列でなければなりません (この文字列が使用される)。dateTimeStylenumberStyle もないと、デフォルトのフォーマットが使用されます (NumberFormat.getInstanceDateFormat.getTimeInstanceDateFormat.getInstance など)。

文字列で単一引用符を使うと、必要に応じて中括弧 ({) を引用することができます。本来の単一引用符は '' で表します。messageFormatElement の中では、引用符は除去されません。たとえば、{1,number,$'#',##} と指定すると、ハッシュ記号 (#) が引用された数値フォーマットが生成されます。結果は、「$#31,45」のようになります。

パターンを使用する場合、引用されていない括弧があれば、それらは一致しなければなりません。つまり、「ab {0} de」と「ab '}' de」は正しいのですが、「ab {0'}'de」と「ab } de」は正しくありません。

この引数は 0 から 9 の数字です。この数字は、フォーマットする配列で指定される引数の数に対応します。

列の中に使用されない引数があってもかまいません。引数が足りなかったり、指定されたフォーマットに対する正しいクラスのものでないと、ParseException がスローされます。format はまず、その引数に対し、Format オブジェクトが setFormats メソッドで指定されているかどうかをチェックします。指定されていれば、format はその Format オブジェクトを使って、その引数をフォーマットします。指定されていなければ、引数はそのオブジェクトの型に基づいてフォーマットされます。引数が Number であれば、formatNumberFormat.getInstance を使って引数をフォーマットします。引数が Date であれば、formatDateFormat.getDateTimeInstance を使って引数をフォーマットします。それ以外の場合は、toString メソッドを使用します。

さらに複雑なパターンの場合、ChoiceFormat を使って次のように出力を得ることもできます。

 MessageFormat form = new MessageFormat("The disk ¥"{1}¥" contains {0}.");
 double[] filelimits = {0,1,2};
 String[] filepart = {"no files","one file","{0,number} files"};
 ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
 form.setFormat(1,fileform); // NOT zero, see below

 Object[] testArgs = {new Long(12373), "MyDisk"};

 System.out.println(form.format(testArgs));

 // output, with different testArgs
 output: The disk "MyDisk" contains no files.
 output: The disk "MyDisk" contains one file.
 output: The disk "MyDisk" contains 1,273 files.
 
これは、上の例のようにプログラム的に行うか、次のようにパターン(詳細は、ChoiceFormat を参照)を使って行うことができます。
 form.applyPattern(
    "There {0,choice,0#are no files|1#is one file|1#are {0,number,integer} files}.");
 

注: 前述のように、MessageFormatChoiceFormat で生成される文字列は、特別に処理されます。複数の { を使ってサブフォーマットを表し、繰り返しを行います。MessageFormatChoiceFormat を両方とも (文字列パターンではなく) プログラム的に作成する場合には、再帰的に繰り返すフォーマットを作成しないように注意してください。永久ループになります。

注: フォーマットは、文字列における変数の順に従って数えられます。これは、引数の数え方と同じではありません。たとえば、abc{2}def{3}ghi{0}... の場合、

1 つの引数が文字列内で複数回解析されると、最後に一致するものが解析の最終結果になります。次に例を示します。

 MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}");
 Object[] objs = {new Double(3.1415)};
 String result = mf.format( objs );
 // result now equals "3.14, 3.1"
 objs = null;
 objs = mf.parse(result, new ParsePosition(0));
 // objs now equals {new Double(3.1)}
 

同様に、同じ引数が複数回出てくるパターンを使って MessageFormat オブジェクトを解析すると、最後に一致するものが返されます。次に例を示します。

 MessageFormat mf = new MessageFormat("{0}, {0}, {0}");
 String forParsing = "x, y, z";
 Object[] objs = mf.parse(forParsing, new ParsePosition(0));
 // result now equals {new String("z")}
 

setLocale に続けて applyPattern (場合によっては setFormat も) を使うと、異なるロケールで MessageFormat を初期化し直すことができます。

関連項目:
Locale, Format, NumberFormat, DecimalFormat, ChoiceFormat, 直列化された形式

コンストラクタの概要
MessageFormat(String pattern)
          指定されたパターンで構築します。
 
メソッドの概要
 void applyPattern(String newPattern)
          パターンを設定します。
 Object clone()
          Cloneable をオーバーライドします。
 boolean equals(Object obj)
          2 つのメッセージフォーマットオブジェクトの間の等号比較です。
 StringBuffer format(Object[] source, StringBuffer result, FieldPosition ignore)
          フォーマットされたオブジェクトとともにパターンを返します。
 StringBuffer format(Object source, StringBuffer result, FieldPosition ignore)
           
static String format(String pattern, Object[] arguments)
          簡易ルーチンです。
 Format[] getFormats()
          setFormats で設定されたフォーマットを取得します。
 Locale getLocale()
          ロケールを取得します。
 int hashCode()
          メッセージフォーマットオブジェクトのハッシュコードを生成します。
 Object[] parse(String source)
          文字列を解析します。
 Object[] parse(String source, ParsePosition status)
          文字列を解析します。
 Object parseObject(String text, ParsePosition status)
          文字列を解析します。
 void setFormat(int variable, Format newFormat)
          変数に使うフォーマットをパターンに設定します。
 void setFormats(Format[] newFormats)
          パラメータで使用するフォーマットを設定します。
 void setLocale(Locale theLocale)
          指定されたパターンで構築し、引数に対してそのパターンでフォーマットします。
 String toPattern()
          パターンを取得します。
 
クラス java.text.Format から継承したメソッド
format, parseObject
 
クラス java.lang.Object から継承したメソッド
finalize, getClass, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

MessageFormat

public MessageFormat(String pattern)
指定されたパターンで構築します。
関連項目:
applyPattern(java.lang.String)
メソッドの詳細

setLocale

public void setLocale(Locale theLocale)
指定されたパターンで構築し、引数に対してそのパターンでフォーマットします。

getLocale

public Locale getLocale()
ロケールを取得します。このロケールは、デフォルトの数値や日付のフォーマット情報を取得するために使用します。

applyPattern

public void applyPattern(String newPattern)
パターンを設定します。クラスの説明を参照してください。

toPattern

public String toPattern()
パターンを取得します。クラスの説明を参照してください。

setFormats

public void setFormats(Format[] newFormats)
パラメータで使用するフォーマットを設定します。フォーマットの数え方については、クラスの説明を参照してください。

setFormat

public void setFormat(int variable,
                      Format newFormat)
変数に使うフォーマットをパターンに設定します。
パラメータ:
variable - フォーマット内の変数を示すゼロから始まる番号。これは引数の個数ではない。variable が範囲外にある場合は ArrayIndexOutOfBoundsException がスローされる
newFormat - 指定された変数に使うフォーマット

getFormats

public Format[] getFormats()
setFormats で設定されたフォーマットを取得します。フォーマットの数え方については、クラスの説明を参照してください。

format

public final StringBuffer format(Object[] source,
                                 StringBuffer result,
                                 FieldPosition ignore)
フォーマットされたオブジェクトとともにパターンを返します。ソースが null の場合は元のパターンが返されます。ソースが null オブジェクトを保持する場合は、フォーマットされた結果によって各引数が文字列 null に置き換えられます。
パラメータ:
source - フォーマットまたは置き換えるオブジェクトからなる配列
result - テキストが追加される位置
ignore - 使用できる状態は返されない

format

public static String format(String pattern,
                            Object[] arguments)
簡易ルーチンです。MessageFormat の明示的な作成は回避されますが、将来最適化を行うことはできません。

format

public final StringBuffer format(Object source,
                                 StringBuffer result,
                                 FieldPosition ignore)
オーバーライド:
クラス Format 内の format

parse

public Object[] parse(String source,
                      ParsePosition status)
文字列を解析します。

注意: 解析はさまざまな状況により、うまく動作しないことがあります。たとえば、次のような場合です。

解析が失敗したときは、ParsePosition.getErrorIndex() を使って文字列のどこで解析が失敗したかを調べます。返されるエラーインデックスは、比較の対象文字列サブパターンの開始オフセットです。たとえば、解析文字列 "AAA {0} BBB" がパターン "AAD {0} BBB" と比較されている場合、エラーインデックスは 0 です。エラーが発生すると、このメソッドへの呼び出しが null を返します。ソースが null の場合、空の配列を返します。

parse

public Object[] parse(String source)
               throws ParseException
文字列を解析します。繰り返しはまだ処理しません (置き換える文字列に {n} 個の参照がある場合)。
例外:
ParseException - 文字列が解析できない場合

parseObject

public Object parseObject(String text,
                          ParsePosition status)
文字列を解析します。繰り返しはまだ処理しません (置き換える文字列に %n 個の参照がある場合)。
オーバーライド:
クラス Format 内の parseObject

clone

public Object clone()
Cloneable をオーバーライドします。
オーバーライド:
クラス Format 内の clone

equals

public boolean equals(Object obj)
2 つのメッセージフォーマットオブジェクトの間の等号比較です。
オーバーライド:
クラス Object 内の equals

hashCode

public int hashCode()
メッセージフォーマットオブジェクトのハッシュコードを生成します。
オーバーライド:
クラス Object 内の hashCode

Java プラットフォーム 1.2

バグや機能要求の報告
新しい javadoc の表示についてのコメントやご提案
Java は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-1998 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.