Module java.base
Package java.text

Class ChoiceFormat

所有已实现的接口:
Serializable, Cloneable

public class ChoiceFormat extends NumberFormat
ChoiceFormat 允许您为一系列数字附加格式。通常在处理复数形式时在 MessageFormat 中使用。选择是通过升序的双精度列表指定的,其中每个项目指定一个半开区间直到下一个项目:
 X 匹配 j 当且仅当 limit[j] ≤ X < limit[j+1]
 
如果没有匹配项,则使用第一个或最后一个索引,具体取决于数字 (X) 是太低还是太高。如果限制数组不是按升序排列的,则格式化的结果将不正确。ChoiceFormat 还接受 \u221E 作为无穷大(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[] 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));
}
这里是一个更复杂的示例,带有模式格式:
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));
}

为 ChoiceFormat 对象指定模式相当简单。例如:

ChoiceFormat fmt = new ChoiceFormat(
     "-1#是负数| 0#是零或小数 | 1#是一 |1.0<是 1+ |2#是二 |2<是大于2的。");
System.out.println("格式化模式 : " + fmt.toPattern());

System.out.println("使用 -INF 格式化 : " + fmt.format(Double.NEGATIVE_INFINITY));
System.out.println("使用 -1.0 格式化 : " + fmt.format(-1.0));
System.out.println("使用 0 格式化 : " + fmt.format(0));
System.out.println("使用 0.9 格式化 : " + fmt.format(0.9));
System.out.println("使用 1.0 格式化 : " + fmt.format(1));
System.out.println("使用 1.5 格式化 : " + fmt.format(1.5));
System.out.println("使用 2 格式化 : " + fmt.format(2));
System.out.println("使用 2.1 格式化 : " + fmt.format(2.1));
System.out.println("使用 NaN 格式化 : " + fmt.format(Double.NaN));
System.out.println("使用 +INF 格式化 : " + fmt.format(Double.POSITIVE_INFINITY));
输出结果如下:

 使用 -INF 格式化 : 是负数
 使用 -1.0 格式化 : 是负数
 使用 0 格式化 : 是零或小数
 使用 0.9 格式化 : 是零或小数
 使用 1.0 格式化 : 是一
 使用 1.5 格式化 : 是 1+
 使用 2 格式化 : 是二
 使用 2.1 格式化 : 是大于2的。
 使用 NaN 格式化 : 是负数
 使用 +INF 格式化 : 是大于2的。
 

同步

ChoiceFormat 对象不是同步的。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,必须在外部进行同步。

自版本:
1.1
参见:
  • Constructor Details

  • Method Details

    • applyPattern

      public void applyPattern(String newPattern)
      设置模式。
      参数:
      newPattern - 请参阅类描述。
      抛出:
      NullPointerException - 如果 newPatternnull
    • toPattern

      public String toPattern()
      获取模式。
      返回:
      模式字符串
    • setChoices

      public void setChoices(double[] limits, String[] formats)
      设置用于格式化的选择。
      参数:
      limits - 包含您希望使用该格式解析的顶部值,并且应按升序排序。在格式化 X 时,选择将是 i,其中 limit[i] ≤ X < limit[i+1]。如果限制数组不是按升序排列的,则格式化的结果将不正确。
      formats - 您希望为每个限制使用的格式。
      抛出:
      NullPointerException - 如果 limitsformatsnull
    • getLimits

      public double[] getLimits()
      获取构造函数中传递的限制。
      返回:
      限制。
    • getFormats

      public Object[] getFormats()
      获取构造函数中传递的格式。
      返回:
      格式。
    • format

      public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition status)
      格式的特化。此方法实际上调用 format(double, StringBuffer, FieldPosition),因此支持的长整型范围仅等于可以由双精度数存储的范围。这永远不会是一个实际的限制。
      在类中指定:
      format in class NumberFormat
      参数:
      number - 要格式化的长整型数字
      toAppendTo - 要附加格式化文本的 StringBuffer
      status - 跟踪返回字符串中字段的位置。例如,在 Locale.US 区域设置中格式化数字 123456789 时,如果给定的 fieldPositionNumberFormat.INTEGER_FIELD,则 fieldPosition 的开始索引和结束索引将分别设置为 0 和 11,用于输出字符串 123,456,789
      返回:
      格式化的 StringBuffer
      参见:
    • format

      public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition status)
      返回带有格式化双精度数的模式。
      指定者:
      format 在类 NumberFormat
      参数:
      number - 要格式化和替换的数字。
      toAppendTo - 要追加文本的位置。
      status - 忽略不返回有用状态。
      返回:
      格式化的StringBuffer
      抛出:
      NullPointerException - 如果toAppendTonull
      参见:
    • parse

      public Number parse(String text, ParsePosition status)
      从输入文本中解析数字。
      指定者:
      parse 在类 NumberFormat
      参数:
      text - 源文本。
      status - 一个输入输出参数。在输入时,status.index字段指示应解析的源文本的第一个字符。退出时,如果没有发生错误,status.index设置为源文本中第一个未解析的字符。退出时,如果发生错误,status.index保持不变,并且status.errorIndex设置为导致解析失败的字符的第一个索引。
      返回:
      代表解析数字值的数字。
      抛出:
      NullPointerException - 如果statusnull或者textnull且选择字符串列表不为空。
      参见:
    • nextDouble

      public static final double nextDouble(double d)
      找到大于d的最小double值。如果是NaN,则返回相同的值。

      用于创建半开区间。

      实现注意:
      这等效于调用Math.nextUp(d)
      参数:
      d - 参考值
      返回:
      大于d的最小double值
      参见:
    • previousDouble

      public static final double previousDouble(double d)
      找到小于d的最大double值。如果是NaN,则返回相同的值。
      实现注意:
      这等效于调用Math.nextDown(d)
      参数:
      d - 参考值
      返回:
      小于d的最大double值
      参见:
    • clone

      public Object clone()
      重写Cloneable
      重写:
      clone 在类 NumberFormat
      返回:
      此实例的克隆。
      参见:
    • hashCode

      public int hashCode()
      为消息格式对象生成哈希码。
      重写:
      hashCode 在类 NumberFormat
      返回:
      此对象的哈希码值。
      参见:
    • equals

      public boolean equals(Object obj)
      两者之间的相等比较
      重写:
      equals 在类 NumberFormat
      参数:
      obj - 要比较的参考对象。
      返回:
      如果此对象与obj参数相同,则为true; 否则为false
      参见:
    • nextDouble

      public static double nextDouble(double d, boolean positive)
      找到大于d的最小double值(如果positivetrue),或小于d的最大double值(如果positivefalse)。如果是NaN,则返回相同的值。
      实现注意:
      这等效于调用positive ? Math.nextUp(d) : Math.nextDown(d)
      参数:
      d - 参考值
      positive - 如果需要最小double值,则为true; 否则为false
      返回:
      最小或最大double值