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)
デフォルトの
FORMAT ロケールと指定されたパターンのための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)
FORMAT
ロケールと指定されたパターンのためのMessageFormatを構築します。コンストラクタはロケールを設定してからパターンを解析し、含まれているフォーマット要素についてサブフォーマットのリストを作成します。パターンとその解釈はクラスの概要で指定されています。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
- 入力では、必要であれば位置合わせフィールド。出力では、その位置合わせフィールドのオフセット。result
として渡される文字列バッファー。フォーマットされたテキストが付加されるIllegalArgumentException
- arguments
配列内の引数が、それを使用するフォーマット要素によって予測された型でない場合。public static String format(String pattern, Object... arguments)
(new MessageFormat
(pattern)).format
(arguments, new StringBuffer(), null).toString()
pattern
- パターン文字列arguments
- フォーマットするオブジェクト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)
注意: 解析はさまざまな原因のために、うまく動作しないことがあります。たとえば、
source
- 解析する文字列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, 2014, Oracle and/or its affiliates. All rights reserved.