全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
java.lang.Object
|
+----java.text.Format
|
+----java.text.MessageFormat
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がない場合、引数は文字列でなければなりません(この文字列が使用されます)。dateTimeStyleも numberStyleもないと、デフォルトのフォーマットが使用されます(たとえば、NumberFormat.getInstance、DateFormat.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なら、formatは NumberFormat.getInstanceを使って引数をフォーマットします。引き数が Dateなら、formatは DateFormat.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}.");
注: 上で見たように、MessageFormatの ChoiceFormatで生成される文字列は、特別に処理されます。複数の '{' を使ってサブフォーマットを表し、繰返しを行います。MessageFormatと ChoiceFormatを両方ともプログラム的に(文字列パターンではなく)作成する場合には、再帰的に繰り返すフォーマットを作成しないように気をつけてください。永久ロープになります。
注: フォーマットは、文字列における変数の順に従って数えられます。これは、引数の数え方と同じではありません! たとえば、"abc{2}def{3}ghi{0}..."の場合
public MessageFormat(String pattern)
public void setLocale(Locale theLocale)
public Locale getLocale()
public void applyPattern(String newPattern)
public String toPattern()
public void setFormats(Format newFormats[])
public void setFormat(int variable,
Format newFormat)
public Format[] getFormats()
public final StringBuffer format(Object source[],
StringBuffer result,
FieldPosition ignore)
public static String format(String pattern,
Object arguments[])
public final StringBuffer format(Object source,
StringBuffer result,
FieldPosition ignore)
public Object[] parse(String source,
ParsePosition status)
注意: 解析はさまざまな状況により、うまく作動しないことがあります。たとえば、次のような場合です。
public Object[] parse(String source) throws ParseException
public Object parseObject(String text,
ParsePosition status)
public Object clone()
public boolean equals(Object obj)
public int hashCode()
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス