public class MessageFormat extends Format
MessageFormat
は、連結されたメッセージを、言語に依存しない方法で構築するためのものです。エンドユーザー用に表示するメッセージは、この方法で構築してください。
MessageFormat
は、1 組のオブジェクトをフォーマットし、フォーマットした文字列をパターンの適切な場所に挿入します。
注: MessageFormat
がほかの Format
クラスと異なる点は、MessageFormat
オブジェクトを (getInstance
スタイルのファクトリメソッドではなく) そのコンストラクタの 1 つで作成するということです。MessageFormat
では、ロケール固有の動作は実装されていないので、ファクトリメソッドは必要ありません。ロケール固有の動作は、提供するパターンおよび挿入された引数に使用するサブフォーマットによって定義されます。
MessageFormat
は次のパターンを使用します。
MessageFormatPattern: String MessageFormatPattern FormatElement String FormatElement: { ArgumentIndex } { ArgumentIndex , FormatType } { ArgumentIndex , FormatType , FormatStyle } FormatType: one of number date time choice FormatStyle: short medium long full integer currency percent SubformatPattern
String 内で 1 組の単一引用符を使用して、単一引用符を除く任意の文字を囲むことができます。たとえば、パターン文字列 "'{0}'"
は、FormatElement ではなく、文字列 "{0}"
を表します。単一引用符自体を表すには、String 全体で単一引用符を 2 つにする (''
) 必要があります。たとえば、パターン文字列 "'{''}'"
は、'{'
と '}'
(左右の中括弧が引用符で囲まれたもの) ではなく、'{
(引用の開始と左中括弧)、''
(単一引用符)、}'
(右中括弧と引用の終了) が連続するものとして解釈され、文字列 "{}"
ではなく、"{'}"
を表します。
SubformatPattern は対応するサブフォーマットで解釈され、サブフォーマットに依存するパターンの規則が適用されます。たとえば、パターン文字列 "{1,number,$'#',##}"
(下線付きの SubformatPattern) と指定すると、ハッシュ記号 (#) が付いた数値フォーマットが生成されます。結果は、"$#31,45"
のようになります。詳細は、Format
サブクラスのドキュメントを参照してください。
一致しない引用符は、指定されたパターンの最後で閉じられるものとして処理されます。たとえば、パターン文字列 "'{0}"
はパターン "'{0}'"
として処理されます。
引用符で囲まれていないパターン内の中括弧のバランスを取る必要があります。たとえば、"ab {0} de"
や "ab '}' de"
は有効なパターンですが、"ab {0'}' de"
、"ab } de"
、"''{''"
は無効です。
MessageFormat
で処理されるのかを示すようにしてください。ローカライザは、変換した文字列でオリジナルのバージョンにはない単一引用符を使用しなければならない場合があります。
ArgumentIndex 値は、数字 '0'
- '9'
を使用して記述した 0 以上の整数です。format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列のインデックスを表します。
FormatType および FormatStyle 値は、フォーマット要素の Format
インスタンスの生成に使用します。次の表に、Format
インスタンスへの値のマップについて示します。表にない組み合わせは使用できません。SubformatPattern は、使用する Format
サブクラスに対して有効なパターン文字列である必要があります。
次にいくつかの使用例を示します。もちろん実際の国際化されたプログラムでは、メッセージフォーマットパターンやその他の静的な文字列はリソースバンドルから取得されます。その他のパラメータは実行時に動的に決定されます。
最初の例では、static メソッド MessageFormat.format
を使用しています。このメソッドは内部的に、1 度限りの使用目的で MessageFormat
インスタンスを作成します。
出力結果は次のようになります。int planet = 7; String event = "a disturbance in the Force"; String result = MessageFormat.format( "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.", planet, new Date(), event);
At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
次の例では、繰り返し使用可能な MessageFormat
インスタンスを作成しています。
int fileCount = 1273; String diskName = "MyDisk"; Object[] testArgs = {new Long(fileCount), diskName}; MessageFormat form = new MessageFormat( "The disk \"{1}\" contains {0} file(s)."); System.out.println(form.format(testArgs));
fileCount
にさまざまな値を設定した場合の出力結果を次に示します。
The disk "MyDisk" contains 0 file(s). The disk "MyDisk" contains 1 file(s). The disk "MyDisk" contains 1,273 file(s).
より高度なパターンを実現したければ、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.setFormatByArgumentIndex(0, fileform); int fileCount = 1273; String diskName = "MyDisk"; Object[] testArgs = {new Long(fileCount), diskName}; System.out.println(form.format(testArgs));
fileCount
にさまざまな値を設定した場合の出力結果を次に示します。
The disk "MyDisk" contains no files. The disk "MyDisk" contains one file. The disk "MyDisk" contains 1,273 files.
上の例のように ChoiceFormat
をプログラム的に作成できますが、次のようにパターンを使用することもできます。詳細は、ChoiceFormat
を参照してください。
form.applyPattern( "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");
注: 上記からわかるように、MessageFormat
の ChoiceFormat
によって生成される文字列の扱いはかなり特殊です。「{」の存在によってサブフォーマットであることを示し、再帰処理を行なっています。MessageFormat
と ChoiceFormat
を両方とも (文字列パターンとしてではなく) プログラム的に作成する場合には、再帰的に繰り返すフォーマットを作成して永久ループに陥らないように注意してください。
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")}
メッセージフォーマットは同期化されません。スレッドごとに別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドがフォーマットに並行してアクセスする場合は、外部的に同期化する必要があります。
修飾子と型 | クラスと説明 |
---|---|
static class |
MessageFormat.Field
MessageFormat.formatToCharacterIterator から返された AttributedCharacterIterator 内の属性キーとして使用する定数を定義します。 |
コンストラクタと説明 |
---|
MessageFormat(String pattern)
デフォルトロケールと指定されたパターンのための MessageFormat を構築します。
|
MessageFormat(String pattern, Locale locale)
指定されたロケールとパターンのための MessageFormat を構築します。
|
修飾子と型 | メソッドと説明 |
---|---|
void |
applyPattern(String pattern)
このメッセージフォーマットによって使用されるパターンを設定します。
|
Object |
clone()
このオブジェクトのコピーを作成して、返します。
|
boolean |
equals(Object obj)
2 つのメッセージフォーマットオブジェクトの間の等号比較です。
|
StringBuffer |
format(Object[] arguments, StringBuffer result, FieldPosition pos)
オブジェクトの配列をフォーマットし、提供された
StringBuffer に、フォーマット要素をフォーマットされたオブジェクトによって置き換えて MessageFormat のパターンを追加します。 |
StringBuffer |
format(Object arguments, StringBuffer result, FieldPosition pos)
オブジェクトの配列をフォーマットし、提供された
StringBuffer に、フォーマット要素をフォーマットされたオブジェクトによって置き換えて MessageFormat のパターンを追加します。 |
static String |
format(String pattern, Object... arguments)
指定されたパターンを使って MessageFormat を作成し、それを使用して指定された引数をフォーマットします。
|
AttributedCharacterIterator |
formatToCharacterIterator(Object arguments)
オブジェクトの配列をフォーマットし、それを
MessageFormat のパターンに挿入して、AttributedCharacterIterator を生成します。 |
Format[] |
getFormats()
あらかじめ設定されたパターン文字列内のフォーマット要素に使用されるフォーマットを取得します。
|
Format[] |
getFormatsByArgumentIndex()
format メソッドに渡される値または parse メソッドから返された値に使用されるフォーマットを取得します。 |
Locale |
getLocale()
サブフォーマットを作成または比較する場合に使用されるロケールを取得します。
|
int |
hashCode()
メッセージフォーマットオブジェクトのハッシュコードを生成します。
|
Object[] |
parse(String source)
指定された文字列の先頭からテキストを解析してオブジェクト配列を生成します。
|
Object[] |
parse(String source, ParsePosition pos)
文字列を解析します。
|
Object |
parseObject(String source, ParsePosition pos)
文字列からテキストを解析してオブジェクト配列を生成します。
|
void |
setFormat(int formatElementIndex, Format newFormat)
あらかじめ設定されたパターン文字列内の指定されたフォーマット要素インデックスで、フォーマット要素に使用するフォーマットを設定します。
|
void |
setFormatByArgumentIndex(int argumentIndex, Format newFormat)
指定された引数インデックスを使用する、あらかじめ設定されたパターン文字列内のフォーマット要素に使用するフォーマットを設定します。
|
void |
setFormats(Format[] newFormats)
あらかじめ設定されたパターン文字列内のフォーマット要素に使用するフォーマットを設定します。
|
void |
setFormatsByArgumentIndex(Format[] newFormats)
format メソッドに渡される値または parse メソッドから返された値に使用するフォーマットを設定します。 |
void |
setLocale(Locale locale)
サブフォーマットを作成または比較する場合に使用するロケールを設定します。
|
String |
toPattern()
メッセージフォーマットの現在の状態を表すパターンを返します。
|
format, parseObject
public MessageFormat(String pattern)
pattern
- このメッセージフォーマットのためのパターンIllegalArgumentException
- パターンが無効な場合public MessageFormat(String pattern, Locale locale)
pattern
- このメッセージフォーマットのためのパターンlocale
- このメッセージフォーマットのためのロケールIllegalArgumentException
- パターンが無効な場合public void setLocale(Locale locale)
applyPattern
メソッドと toPattern
メソッド (フォーマット要素がフォーマット型を指定しており、そのためサブフォーマットが applyPattern
メソッドで作成される場合)
format
メソッドと formatToCharacterIterator
メソッド (フォーマット要素がフォーマット型を指定しておらず、そのためサブフォーマットがこれらの書式設定メソッドで作成される場合)。
locale
- サブフォーマットを作成または比較する場合に使用するロケールpublic Locale getLocale()
public void applyPattern(String pattern)
pattern
- このメッセージフォーマットのためのパターンIllegalArgumentException
- パターンが無効な場合public String toPattern()
public void setFormatsByArgumentIndex(Format[] newFormats)
format
メソッドに渡される値または parse
メソッドから返された値に使用するフォーマットを設定します。newFormats
内の要素のインデックスは、あらかじめ設定されたパターン文字列で使用される引数インデックスに対応します。したがって、newFormats
内のフォーマットの順序は format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列内の要素の順序に対応します。
引数インデックスがパターン文字列内で複数のフォーマット要素に使用される場合、対応する新しいフォーマットがそのすべてのフォーマット要素に使用されます。引数インデックスが文字列内でどのフォーマット要素にも使用されない場合は、対応する新しいフォーマットは無視されます。提供されたフォーマットが必要数に満たない場合、newFormats.length
より少ない引数インデックスに対するフォーマットだけが置き換えられます。
newFormats
- 使用する新しいフォーマットNullPointerException
- newFormats
が null である場合public void setFormats(Format[] newFormats)
newFormats
内のフォーマットの順序は、パターン文字列内のフォーマット要素の順序に対応します。
パターン文字列で必要とするよりも多くのフォーマットが提供された場合、余ったフォーマットは無視されます。必要数に満たない場合は、最初の newFormats.length
だけが置き換えられます。
パターン文字列内のフォーマット要素の順序はローカリゼーションの処理過程で変更されることが多いため、通常は setFormatsByArgumentIndex
メソッドを使用するほうが効率的です。このメソッドは、フォーマットの順序を format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列内の要素の順序に対応するものと見なします。
newFormats
- 使用する新しいフォーマットNullPointerException
- newFormats
が null である場合public void setFormatByArgumentIndex(int argumentIndex, Format newFormat)
format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列のインデックスを表します。
引数インデックスがパターン文字列内で複数のフォーマット要素に使用される場合、新しいフォーマットがそのすべてのフォーマット要素に使用されます。引数インデックスが文字列内でどのフォーマット要素にも使用されない場合は、新しいフォーマットは無視されます。
argumentIndex
- 新しいフォーマットに使用するための引数インデックスnewFormat
- 使用する新しいフォーマットpublic void setFormat(int formatElementIndex, Format newFormat)
パターン文字列内のフォーマット要素の順序は、ローカリゼーションの処理過程で変更されることが多いため、通常は setFormatByArgumentIndex
メソッドを使用するほうが効率的です。このメソッドは、フォーマット要素が指定する引数インデックスを基に、フォーマット要素にアクセスします。
formatElementIndex
- パターン内のフォーマット要素のインデックスnewFormat
- 指定されたフォーマット要素に使うフォーマットArrayIndexOutOfBoundsException
- formatElementIndex
が、パターン文字列内のフォーマット要素の数以上の場合public Format[] getFormatsByArgumentIndex()
format
メソッドに渡される値または parse
メソッドから返された値に使用されるフォーマットを取得します。返された配列内の要素のインデックスは、あらかじめ設定されたパターン文字列で使用される引数インデックスに対応します。したがって、返された配列内のフォーマットの順序は、format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列内の要素の順序に対応します。
引数インデックスがパターン文字列内で複数のフォーマット要素に使用される場合、その最後のフォーマット要素で使用されるフォーマットが配列に返されます。引数インデックスが文字列内でどのフォーマット要素にも使用されない場合は、null が配列に返されます。
public Format[] getFormats()
パターン文字列内のフォーマット要素の順序はローカリゼーションの処理過程で変更されることが多いため、通常は getFormatsByArgumentIndex
メソッドを使用するほうが効率的です。このメソッドは、フォーマットの順序を format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列内の要素の順序に対応するものと見なします。
public final StringBuffer format(Object[] arguments, StringBuffer result, FieldPosition pos)
StringBuffer
に、フォーマット要素をフォーマットされたオブジェクトによって置き換えて MessageFormat
のパターンを追加します。
個々のフォーマット要素に置換されたテキストは、次の表の最初に一致する行で示されるように、フォーマット要素の現在のサブフォーマットとフォーマット要素の引数インデックスにある arguments
要素から得られます。引数は、arguments
が null
であるか、または要素の数が argumentIndex+1 個より少ない場合、使用不可です。
サブフォーマット | 引数 | フォーマットされたテキスト |
---|---|---|
任意 | 使用不可 | "{" + argumentIndex + "}"
|
任意 | null
| "null"
|
instanceof ChoiceFormat
| 任意 | subformat.format(argument).indexOf('{') >= 0 ?
|
!= null
| 任意 | subformat.format(argument)
|
null
| instanceof Number
| NumberFormat.getInstance(getLocale()).format(argument)
|
null
| instanceof Date
| DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, getLocale()).format(argument)
|
null
| instanceof String
| argument
|
null
| 任意 | argument.toString()
|
pos
が null でなく、かつ Field.ARGUMENT
を参照している場合、最初のフォーマットされた文字列の位置が返されます。
arguments
- フォーマットするかまたは置き換えるオブジェクトからなる配列。result
- テキストが追加される位置。pos
- 入力では、必要であれば位置合わせフィールド。出力では、その位置合わせフィールドのオフセット。IllegalArgumentException
- arguments
配列内の引数が、それを使用するフォーマット要素によって予測された型でない場合。public static String format(String pattern, Object... arguments)
(new MessageFormat
(pattern)).format
(arguments, new StringBuffer(), null).toString()
IllegalArgumentException
- パターンが無効な場合、または arguments
配列内の引数が、それを使用するフォーマット要素によって予測された型でない場合。public final StringBuffer format(Object arguments, StringBuffer result, FieldPosition pos)
StringBuffer
に、フォーマット要素をフォーマットされたオブジェクトによって置き換えて MessageFormat
のパターンを追加します。これは次の記述と同等です。
format
((Object[]) arguments, result, pos)
format
、クラス: Format
arguments
- フォーマットするかまたは置き換えるオブジェクトからなる配列。result
- テキストが追加される位置。pos
- 入力では、必要であれば位置合わせフィールド。出力では、その位置合わせフィールドのオフセット。toAppendTo
として渡される文字列バッファー。フォーマットされたテキストが追加されるIllegalArgumentException
- arguments
配列内の引数が、それを使用するフォーマット要素によって予測された型でない場合。public AttributedCharacterIterator formatToCharacterIterator(Object arguments)
MessageFormat
のパターンに挿入して、AttributedCharacterIterator
を生成します。返された AttributedCharacterIterator
を使用すると、結果の String を構築できるとともに、結果の String についての情報を判定できます。
返された AttributedCharacterIterator
のテキストは、次の記述によって返されるテキストと同一です。
format
(arguments, new StringBuffer(), null).toString()
さらに、AttributedCharacterIterator
は、少なくとも arguments
配列内の引数からテキストが生成された位置を示す属性を含みます。これらの属性のキーは MessageFormat.Field
型です。属性の値は、テキストが生成された引数の arguments
配列内のインデックスを示す Integer
オブジェクトです。
MessageFormat
が使用する基本の Format
インスタンスからの属性/値も、結果の AttributedCharacterIterator
に配置されます。これにより、結果の String 内の引数の位置がわかるだけでなく、その引数がどのフィールドに含まれているかもわかります。
formatToCharacterIterator
、クラス: Format
arguments
- フォーマットするかまたは置き換えるオブジェクトからなる配列。NullPointerException
- arguments
が null である場合。IllegalArgumentException
- arguments
配列内の引数が、それを使用するフォーマット要素によって予測された型でない場合。public Object[] parse(String source, ParsePosition pos)
注意:解析はさまざまな原因のために、うまく動作しないことがあります。たとえば、
public Object[] parse(String source) throws ParseException
メッセージの解析の詳細については、parse(String, ParsePosition)
メソッドを参照してください。
source
- 先頭が解析される String
。Object
配列。ParseException
- 指定された文字列の先頭が解析できない場合。public Object parseObject(String source, ParsePosition pos)
メソッドは pos
によって指定されたインデックスを開始位置としてテキストの解析を試みます。解析が完了すると、pos
のインデックスは、使用された最後の文字 (解析では、文字列の最後までのすべての文字が使用されるとは限らない) のあとのインデックスに更新され、解析されたオブジェクト配列が返されます。更新された pos
は、このメソッドの次の呼び出しの開始点を示すのに使用できます。エラーが発生した場合は、pos
のインデックスは変更されず、エラーが発生した文字のインデックスに pos
のエラーインデックスが設定され、null が返されます。
メッセージの解析の詳細については、parse(String, ParsePosition)
メソッドを参照してください。
parseObject
、クラス: Format
source
- 部分的に解析される String
。pos
- 上記のインデックスおよびエラーインデックス情報を持つ ParsePosition
オブジェクトObject
配列。エラーの場合は null を返す。NullPointerException
- pos
が null である場合。public Object clone()
public boolean equals(Object obj)
equals
、クラス: Object
obj
- 比較対象の参照オブジェクト。true
、それ以外の場合は false
。Object.hashCode()
、HashMap
public int hashCode()
hashCode
、クラス: Object
Object.equals(java.lang.Object)
, System.identityHashCode(java.lang.Object)
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.