モジュール java.base
パッケージ java.text

クラスChoiceFormat

java.lang.Object
すべての実装されたインタフェース:
Serializable, Cloneable

public class ChoiceFormat extends NumberFormat
ChoiceFormatは、数値の範囲にフォーマットをアタッチできるNumberFormatの具象サブクラスです。 通常、複数形を処理するためにMessageFormatで使用されます。 この選択項目はdoubleの昇順リストで指定され、それぞれの項目は、次の項目までの一方が開いた間隔を指定します。
 X matches j if and only if limit[j] ≤ X < limit[j+1]
 
一致するものがない場合、数値(X)が小さすぎるのか大きすぎるのかによって、最初または最後のインデックスが使用されます。 リミット配列が昇順でない場合、フォーマットの結果は正しくならない。 ChoiceFormatはまた、\u221Eをinfinity(INF)と同等なものとして受け付けます。

ノート: ChoiceFormatは、他のFormatクラスとは次の点で異なります。ChoiceFormatオブジェクトは、getInstanceスタイル・ファクトリ・メソッドではなく、コンストラクタで作成します。 ChoiceFormatでは、指定されたロケールに対して複雑なセット・アップは必要ないので、ファクトリ・メソッドは不要です。 実際、ChoiceFormatには、ロケール固有の動作は実装されません。

ChoiceFormatは、書式の配列と制限の配列、または文字列パターンのいずれかを使用して構築できます。 書式配列と制限配列を使用して構築する場合、これらの配列の長さは同じである必要があります。 たとえば、

  • limits = {1,2,3,4,5,6,7}
    formats = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"}
  • limits ={0, 1, ChoiceFormat.nextDouble(1)}
    formats ={"no files", "one file", "many files"}
    (nextDoubleは、次に大きなdoubleを取得して、一方が開いた間隔を作るのに使用する)

次に、値を書式設定および解析するための配列を含むChoiceFormatを構成する例を示します。

double[] limits = {1,2,3,4,5,6,7};
String[] dayOfWeekNames = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"};
ChoiceFormat form = new ChoiceFormat(limits, dayOfWeekNames);
ParsePosition status = new ParsePosition(0);
for (double i = 0.0; i <= 8.0; ++i) {
    status.setIndex(0);
    System.out.println(i + " -> " + form.format(i) + " -> "
                             + form.parse(form.format(i),status));
}
より高度なパターンの場合、ChoiceFormatMessageFormatとともに使用して、単数形および複数形の正確な形式を生成できます。
double[] filelimits = {0,1,2};
String[] filepart = {"are no files","is one file","are {2} files"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
Format[] testFormats = {fileform, null, NumberFormat.getInstance()};
MessageFormat pattform = new MessageFormat("There {0} on {1}");
pattform.setFormats(testFormats);
Object[] testArgs = {null, "ADisk", null};
for (int i = 0; i < 4; ++i) {
    testArgs[0] = Integer.valueOf(i);
    testArgs[2] = testArgs[0];
    System.out.println(pattform.format(testArgs));
}
次のように出力されます。

 There are no files on ADisk
 There is one file on ADisk
 There are 2 files on ADisk
 There are 3 files on ADisk
 

Patterns

ChoiceFormatパターンの構文は次のとおりです。
Pattern:
SubPattern *("|" SubPattern)
ノート: 追加の各SubPatternには、前のサブパターンの制限より大きい制限が必要です
SubPattern:
関係書式の制限
制限:
数値 / "∞" / "-∞"
番号:
["-"] *(Digit) 1*(Decimal / Digit) *(Digit) [指数]
Decimal:
1*(Digit ".") / 1*("." Digit)
Digit:
0 - 9
Exponent:
*(Digit)桁ExponentSymbol桁 *(Digit)
ExponentSymbol:
"e" / "E"
関連:
"#" / "<" / "≤"
書式:
「関連」記号を除く任意の文字
ノート:関係≤は<=と同等ではありません

「関連」シンボルを「フォーマット」パターン内で使用する場合は、一重引用符で囲む必要があります。 たとえば、new ChoiceFormat("1# '#'1 ").format(1)" #1 "を返します。 1行に2つの一重引用符を使用して、リテラル一重引用符を生成します。 たとえば、new ChoiceFormat("1# ''one'' ").format(1)" 'one' "を返します。

次に、パターンを使用してChoiceFormatを作成する例を示します。

ChoiceFormat fmt = new ChoiceFormat(
     "-1#is negative| 0#is zero or fraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2.");

System.out.println(fmt.format(Double.NEGATIVE_INFINITY)); // outputs "is negative"
System.out.println(fmt.format(-1.0)); // outputs "is negative"
System.out.println(fmt.format(0)); // outputs "is zero or fraction"
System.out.println(fmt.format(0.9)); // outputs "is zero or fraction"
System.out.println(fmt.format(1)); // outputs "is one"
System.out.println(fmt.format(1.5)); // outputs "is 1+"
System.out.println(fmt.format(2)); // outputs "is two"
System.out.println(fmt.format(2.1)); // outputs "is more than 2."
System.out.println(fmt.format(Double.NaN)); // outputs "is negative"
System.out.println(fmt.format(Double.POSITIVE_INFINITY)); // outputs "is more than 2."

Synchronization

choiceフォーマットは同期化されません。 スレッドごとに別のフォーマット・インスタンスを作成することをお薦めします。 複数のスレッドがフォーマットに並行してアクセスする場合は、外部的に同期化する必要があります。

導入されたバージョン:
1.1
関連項目: