|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Object
|
+--java.text.Format
|
+--java.text.MessageFormat
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 がない場合、引数は文字列でなければなりません (この文字列が使用される)。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}... の場合、
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 |
| コンストラクタの詳細 |
public MessageFormat(String pattern)
applyPattern(java.lang.String)| メソッドの詳細 |
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)
variable - フォーマット内の変数を示すゼロから始まる番号。これは引数の個数ではない。variable が範囲外にある場合は ArrayIndexOutOfBoundsException がスローされるnewFormat - 指定された変数に使うフォーマットpublic Format[] getFormats()
public final StringBuffer format(Object[] source,
StringBuffer result,
FieldPosition ignore)
source - フォーマットするかまたは置き換えるオブジェクトからなる配列result - テキストが追加される位置ignore - 有用でない状態が返される
public static String format(String pattern,
Object[] arguments)
public final StringBuffer format(Object source,
StringBuffer result,
FieldPosition ignore)
Format 内の formatsource - フォーマットするかまたは置き換えるオブジェクトからなる配列result - テキストが追加される位置ignore - 有用でない状態が返される
public Object[] parse(String source,
ParsePosition status)
注意: 解析はさまざまな状況により、うまく動作しないことがあります。たとえば、次のような場合です。
public Object[] parse(String source)
throws ParseException
ParseException - 文字列が解析できない場合
public Object parseObject(String text,
ParsePosition status)
Format 内の parseObjectjava.text.Format からコピーされたタグ:status - 入力 - 出力パラメータ
このメソッドを呼び出す前に、ソースにおいて解析を開始するオフセットを、status.index に設定する必要があります。呼び出したあと、status.index は、解析されたテキストの終わりにあります。エラーがあるとインデックスは変更されません。
解析の際、先行のスペースは破棄されます (解析が正常な場合)。後ろのスペースは元のままです。
例: 「_12_xy」(_ はスペースを表す) を解析して数字を見つけると (インデックス == 0)、結果は数字 12 で、status.index が 3 に更新されます (2 つ目のスペースの前)。2 回目の解析では、「xy」が数字ではないので、結果は ParseException になり、status.index は 3 のままです。
一般にサブクラスでは特定の解析メソッドが提供されますが、それらによってさまざまな型の値が返されます。メソッドは戻り型にオーバーロードすることができないので、これらは一般に parse と呼ばれます。一方、この多相性のあるメソッドは、常に parseObject と呼ばれます。状態を取らない解析メソッドは、必要なフォーマットのテキストが開始位置になければ、ParseException をスローする必要があります。
ParsePositionpublic Object clone()
Format 内の clonejava.lang.Object からコピーされたタグ:CloneNotSupportedException - オブジェクトのクラスが Cloneable インタフェースをサポートしていない場合。clone メソッドをオーバーライドしたサブクラスも、インスタンスを複製できないことを示すためにこの例外をスローすることがあるOutOfMemoryError - 十分なメモリがない場合Cloneablepublic boolean equals(Object obj)
Object 内の equalsjava.lang.Object からコピーされたタグ:obj - 比較対象の参照オブジェクトtrue、そうでない場合は falseBoolean.hashCode(),
Hashtablepublic int hashCode()
Object 内の hashCodejava.lang.Object からコピーされたタグ:Object.equals(java.lang.Object),
Hashtable
|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.