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, parseObjectpublic 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、クラス: Formatarguments - フォーマットするかまたは置き換えるオブジェクトからなる配列。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、クラス: Formatarguments - フォーマットするかまたは置き換えるオブジェクトからなる配列。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、クラス: Formatsource - 部分的に解析されるString。pos - 上記のインデックスおよびエラー・インデックス情報を持つParsePositionオブジェクトObject配列。エラーの場合はnullを返す。NullPointerException - posがnullである場合。public Object clone()
public boolean equals(Object obj)
equals、クラス: Objectobj - 比較対象の参照オブジェクト。true、それ以外の場合はfalse。Object.hashCode()、HashMappublic int hashCode()
hashCode、クラス: ObjectObject.equals(java.lang.Object), System.identityHashCode(java.lang.Object) バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.