|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.text.Format java.text.MessageFormat
public class MessageFormat
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: StringPartopt String StringPart StringPart: '' ' QuotedString ' UnquotedString SubformatPattern: SubformatPatternPartopt SubformatPattern SubformatPatternPart SubFormatPatternPart: ' QuotedPattern ' UnquotedPattern
String 内では、「''
」は単一引用符を表します。QuotedString は単一引用符を除く任意の文字を含みます。 囲んでいる単一引用符は削除されます。UnquotedString は、単一引用符と左大括弧を除く任意の文字を含みます。したがって、フォーマットされたメッセージで「'{0}'」になる文字列は、「'''{'0}''
」または「'''{0}'''
」と記述します。
SubformatPattern 内では異なるルールが適用されます。QuotedPattern は単一引用符以外の任意の文字を含みますが、囲んでいる単一引用符は削除されません。 このため単一引用符はサブフォーマットによって解釈されます。たとえば、「{1,number,$'#',##}
」と指定すると、ハッシュ記号 (#) が付いた数値フォーマットが生成されます。 結果は、「$#31,45」のようになります。"$#31,45". UnquotedPattern は、単一引用符以外の任意の文字を含みますが、その中の中括弧はペアになっている必要があります。たとえば、「ab {0} de
」と「ab '}' de
」は有効なサブフォーマットパターンですが、「ab {0'}' de
」と「ab } de
」は無効です。
ArgumentIndex 値は、数字 0 〜 9 を使用して記述した 0 以上の整数です。format
メソッドに渡された arguments
配列または parse
メソッドによって返された結果の配列のインデックスを表します。
FormatType および FormatStyle 値は、フォーマット要素の Format
インスタンスの生成に使用します。次の表に、Format インスタンスへの値のマップについて示します。表にない組み合わせは使用できません。SubformatPattern は、使用する Format サブクラスに対して有効なパターン文字列である必要があります。
フォーマット型 | フォーマットスタイル | 生成されるサブフォーマット |
---|---|---|
(なし) | (なし) | null
|
number
| (なし) | NumberFormat.getInstance(getLocale())
|
integer
| NumberFormat.getIntegerInstance(getLocale())
| |
currency
| NumberFormat.getCurrencyInstance(getLocale())
| |
percent
| NumberFormat.getPercentInstance(getLocale())
| |
SubformatPattern | new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(getLocale()))
| |
date
| (なし) | DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())
|
short
| DateFormat.getDateInstance(DateFormat.SHORT, getLocale())
| |
medium
| DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())
| |
long
| DateFormat.getDateInstance(DateFormat.LONG, getLocale())
| |
full
| DateFormat.getDateInstance(DateFormat.FULL, getLocale())
| |
SubformatPattern | new SimpleDateFormat(subformatPattern, getLocale())
| |
time
| (なし) | DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())
|
short
| DateFormat.getTimeInstance(DateFormat.SHORT, getLocale())
| |
medium
| DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())
| |
long
| DateFormat.getTimeInstance(DateFormat.LONG, getLocale())
| |
full
| DateFormat.getTimeInstance(DateFormat.FULL, getLocale())
| |
SubformatPattern | new SimpleDateFormat(subformatPattern, getLocale())
| |
choice
| SubformatPattern | new ChoiceFormat(subformatPattern)
|
次にいくつかの使用例を示します。もちろん実際の国際化されたプログラムでは、メッセージフォーマットパターンやその他の静的な文字列はリソースバンドルから取得されます。その他のパラメータは実行時に動的に決定されます。
最初の例では、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")}
メッセージフォーマットは同期化されません。スレッドごとに別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドがフォーマットに並行してアクセスする場合は、外部的に同期化する必要があります。
Locale
,
Format
,
NumberFormat
,
DecimalFormat
,
ChoiceFormat
,
直列化された形式入れ子のクラスの概要 | |
---|---|
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()
メッセージフォーマットの現在の状態を表すパターンを返します。 |
クラス java.text.Format から継承されたメソッド |
---|
format, parseObject |
クラス java.lang.Object から継承されたメソッド |
---|
finalize, getClass, notify, notifyAll, toString, wait, wait, wait |
コンストラクタの詳細 |
---|
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 内の引数の位置がわかるだけでなく、その引数がどのフィールドに含まれているかもわかります。
Format
内の formatToCharacterIterator
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)
メソッドを参照してください。
Format
内の parseObject
source
- 部分的に解析される String
pos
- 上記のインデックスおよびエラーインデックス情報を持つ ParsePosition
オブジェクト
Object
配列エラーの場合は null を返す
NullPointerException
- pos
が null の場合public Object clone()
Format
内の clone
Cloneable
public boolean equals(Object obj)
Object
内の equals
obj
- 比較対象の参照オブジェクト
true
、そうでない場合は false
Object.hashCode()
,
Hashtable
public int hashCode()
Object
内の hashCode
Object.equals(java.lang.Object)
,
Hashtable
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。