全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス

クラス java.text.MessageFormat

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

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

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

Note: MessageFormatが他の Formatクラスと異なる点は、MessageFormatオブジェクトをその構築子の1つで構築するということです(getInstanceスタイルのファクトリメソッドではなく)。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.getTimeInstance、またはDateFormat.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}..."の場合

参照:
Locale, Format, NumberFormat, DecimalFormat, ChoiceFormat

Constructor Index

 o MessageFormat(String)
指定するパターンで構築します。

Method Index

 o applyPattern(String)
パターンを設定します。
 o clone()
Cloneableをオーバーライドします。
 o equals(Object)
2つのメッセージフォーマットオブジェクトの等号比較です。
 o format(Object, StringBuffer, FieldPosition)
オブジェクトをフォーマットして文字列を生成します。
 o format(Object[], StringBuffer, FieldPosition)
フォーマットされたオブジェクトとともにパターンを返します。
 o format(String, Object[])
コンビニエンスルーチンです。
 o getFormats()
setFormatsで設定されたフォーマットを入手します。
 o getLocale()
ロケールを入手します。
 o hashCode()
メッセージフォーマットオブジェクトのハッシュコードを生成します。
 o parse(String)
文字列を解析します。
 o parse(String, ParsePosition)
文字列を解析します。
 o parseObject(String, ParsePosition)
文字列を解析します。
 o setFormat(int, Format)
パラメータで使用するフォーマットを個別に設定します。
 o setFormats(Format[])
パラメータで使用するフォーマットを設定します。
 o setLocale(Locale)
指定のパターンで構築し、引数に対しそのパターンでフォーマットします。
 o toPattern()
パターンを入手します。

Constructors

 o MessageFormat
  public MessageFormat(String pattern)
指定のパターンで構築します。

参照:
applyPattern

Methods

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

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

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

 o toPattern
  public String toPattern()
パターンを入手します。そのクラスの記述を参照してください。

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

 o setFormat
  public void setFormat(int variable,
                        Format newFormat)
パラメータで使用するフォーマットを個別に設定します。フォーマットの数え方については、クラス記述を参照してください。

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

 o format
  public final StringBuffer format(Object source[],
                                   StringBuffer result,
                                   FieldPosition ignore)
フォーマットされたオブジェクトとともにパターンを返します。

パラメータ:
source - フォーマットまたは置き換えるオブジェクトからなる配列
result - テキストが追加されるところ
ignore - 使用できる状態は返されない
 o format
  public static String format(String pattern,
                              Object arguments[])
コンビニエンスルーチン。MessageFormatを明示的に作成しませんが、これは、将来の最適化を狙ったものではありません。

 o format
  public final StringBuffer format(Object source,
                                   StringBuffer result,
                                   FieldPosition ignore)
オブジェクトをフォーマットして文字列を生成します。

オーバーライド:
クラス Formatformat
 o parse
  public Object[] parse(String source,
                        ParsePosition status)
文字列を解析します。

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

 o parse
  public Object[] parse(String source) throws ParseException
ストリングを解析します。反復をまだ処理しません(置き換える文字列に {n}個の参照がある場合)。

例外: ParseException
文字列が解析できない場合
 o parseObject
  public Object parseObject(String text,
                            ParsePosition status)
ストリングを解析します。反復はまだ処理しません(置き換える文字列に%n個の参照がある場合)。

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

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

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

オーバーライド:
クラスObjecthashCode

全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス