ChoiceFormat is a concrete subclass of NumberFormat that
allows you to attach a format to a range of numbers.
It is generally used in a MessageFormat for handling plurals.
The choice is specified with an ascending list of doubles, where each item
specifies a half-open interval up to the next item:
If there is no match, then either the first or last index is used, depending on whether the number (X) is too low or too high. If the limit array is not in ascending order, the results of formatting will be incorrect. ChoiceFormat also acceptsX matches j if and only if limit[j] ≤ X < limit[j+1]
\u221E as equivalent to infinity(INF).Note
ChoiceFormat differs from the other Format
classes in that you create a ChoiceFormat object with a
constructor (not with a getInstance style factory
method). The factory methods aren't necessary because ChoiceFormat
doesn't require any complex setup for a given locale. In fact,
ChoiceFormat doesn't implement any locale specific behavior.
ChoiceFormat pattern has the following syntax:
Note:The relation ≤ is not equivalent to <=
- Pattern:
- SubPattern *("|" SubPattern)
- SubPattern:
- Limit Relation Format
- Note: Each additional SubPattern must have an ascending Limit-Relation interval
- Limit:
- Number / "∞" / "-∞"
- Number:
- ["-"] *(Digit) 1*(Decimal / Digit) *(Digit) [Exponent]
- Decimal:
- 1*(Digit ".") / 1*("." Digit)
- Digit:
- 0 - 9
- Exponent:
- *(Digit) Digit ExponentSymbol Digit *(Digit)
- ExponentSymbol:
- "e" / "E"
- Relation:
- "#" / "<" / "≤"
- Format:
- Any characters except the special pattern character '|'
To use a reserved special pattern character within a Format pattern,
it must be single quoted. For example, new ChoiceFormat("1#'|'foo'|'").format(1)
returns "|foo|".
Use two single quotes in a row to produce a literal single quote. For example,
new ChoiceFormat("1# ''one'' ").format(1) returns " 'one' ".
A ChoiceFormat can be constructed using either an array of formats
and an array of limits or a string pattern. When constructing with
format and limit arrays, the length of these arrays must be the same.
For example,
nextDouble can be used to get the next higher double, to
make the half-open interval.)
Below is an example of constructing a ChoiceFormat with arrays to format and parse values:
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)); }
Below is an example of constructing a ChoiceFormat with a String pattern:
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."
For more sophisticated patterns, ChoiceFormat can be used with
MessageFormat to produce accurate forms for singular and plural:
MessageFormat msgFmt = new MessageFormat("The disk \"{0}\" contains {1}."); double[] fileLimits = {0,1,2}; String[] filePart = {"no files","one file","{1,number} files"}; ChoiceFormat fileChoices = new ChoiceFormat(fileLimits, filePart); msgFmt.setFormatByArgumentIndex(1, fileChoices); Object[] args = {"MyDisk", 1273}; System.out.println(msgFmt.format(args));
fileCount:
SeeThe disk "MyDisk" contains no files. The disk "MyDisk" contains one file. The disk "MyDisk" contains 1,273 files.
MessageFormat for caveats regarding
MessageFormat patterns within a ChoiceFormat pattern.
Choice formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
API Note
A subclass could perform more consistent pattern validation by
throwing an IllegalArgumentException for all incorrect cases.
See the Implementation Note for this implementation's behavior regarding
incorrect patterns.
This class inherits instance methods from NumberFormat it does
not utilize; a subclass could override and throw UnsupportedOperationException for such methods.
Implementation Note
Given an incorrect pattern, this implementation may either
throw an exception or succeed and discard the incorrect portion. A NumberFormatException is thrown if a limit can not be
parsed as a numeric value and an IllegalArgumentException is thrown
if a SubPattern is missing, or the intervals are not ascending.
Discarding the incorrect portion may result in a ChoiceFormat with
empty limits and formats.
DecimalFormat, MessageFormat
| Modifier and Type | Field and Description |
|---|---|
| private String[] | choiceFormats
A list of choice strings. |
| private double[] | choiceLimits
A list of lower bounds for the choices. |
| private static final long |
| Access | Constructor and Description |
|---|---|
| public | ChoiceFormat(String
the new pattern string newPattern)Constructs a ChoiceFormat with limits and corresponding formats based on the pattern. |
| public | ChoiceFormat(double[]
limits in ascending order limits, String[] corresponding format strings formats)Constructs with the limits and the corresponding formats. |
| Modifier and Type | Method and Description |
|---|---|
| public void | |
| private void | |
| public Object | |
| public boolean | Returns: true if the specified object is equal to this ChoiceFormatobject to be compared for equality obj)Overrides java. Compares the specified object with this |
| public StringBuffer | format(long
number to be formatted and substituted. number, StringBuffer where text is appended. toAppendTo, FieldPosition ignore no useful status is returned. status)Implements abstract java. Specialization of format. |
| pack-priv Format. | format(long number, Format.
Overrides java.
|
| public StringBuffer | format(double
number to be formatted and substituted. number, StringBuffer where text is appended. toAppendTo, FieldPosition ignore no useful status is returned. status)Implements abstract java. Returns pattern with formatted double. |
| pack-priv Format. | format(double number, Format.
Overrides java.
|
| public Object[] | |
| public double[] | |
| public int | Returns: the hash code for thisChoiceFormatOverrides java. Returns the hash code for this |
| public boolean | isStrict()
Overrides java. Returns |
| public static final double | Returns: the least double value greater thandthe reference value d)Finds the least double greater than |
| public static double | Returns: the least or greater double valuethe reference value d, boolean true if the least double is desired;
false otherwiseFinds the least double greater than |
| public Number | Returns: A Number which represents thelimit corresponding to the
format parsed, or Double.NaN if the parse fails.the source text. text, ParsePosition an input-output parameter. On input, the
status.index field indicates the first character of the
source text that should be parsed. On exit, if no error
occurred, status.index is set to the first unparsed character
in the source text. On exit, if an error did occur,
status.index is unchanged and status.errorIndex is set to the
first index of the character that caused the parse to fail. status)Implements abstract java. Parses the input text starting at the index given by the |
| public static final double | Returns: the greatest double value less thandthe reference value d)Finds the greatest double less than |
| private void | readObject(ObjectInputStream in)
Hides java. After reading an object from the input stream, do a simple verification to maintain class invariants. |
| public void | setChoices(double[]
contains the top value that you want
parsed with that format, and should be in ascending sorted order. When
formatting X, the choice will be the i, where
limit[i] ≤ X < limit[i+1].
If the limit array is not in ascending order, the results of formatting
will be incorrect. limits, String[] are the formats you want to use for each limit. formats)Set the choices to be used in formatting. |
| private void | setChoicesImpl(double[] limits, String[] formats)
Implementation of populating the |
| public void | setStrict(boolean strict)
Overrides java. Change the leniency value for parsing. |
| private static double | stringToNum(String str)
Converts a string value to its double representation; this is used to create the limit segment while applying a pattern. |
| public String | Returns: a patternstring that represents the limits and
formats of this ChoiceFormat objectReturns a pattern |
| public String | Returns: a string identifying thisChoiceFormat, for debuggingOverrides java. Returns a string identifying this |
| choiceFormats | back to summary |
|---|---|
| private String[] choiceFormats A list of choice strings. The formatter will return
| |
| choiceLimits | back to summary |
|---|---|
| private double[] choiceLimits A list of lower bounds for the choices. The formatter will return
| |
| serialVersionUID | back to summary |
|---|---|
| private static final long serialVersionUID Hides java. | |
| ChoiceFormat | back to summary |
|---|---|
| public ChoiceFormat(String newPattern) Constructs a ChoiceFormat with limits and corresponding formats
based on the pattern. The syntax and error related caveats for the
ChoiceFormat pattern can be found in the Patterns
section. Unlike
| |
| ChoiceFormat | back to summary |
|---|---|
| public ChoiceFormat(double[] limits, String[] formats) Constructs with the limits and the corresponding formats.
| |
| applyPattern | back to summary |
|---|---|
| public void applyPattern(String newPattern) Apply the given pattern to this ChoiceFormat object. The syntax and error
related caveats for the ChoiceFormat pattern can be found in the
Patterns section. Unlike
| |
| applyPatternImpl | back to summary |
|---|---|
| private void applyPatternImpl(String newPattern) Implementation of applying a pattern to this ChoiceFormat.
This method processes a String pattern in accordance with the ChoiceFormat
pattern syntax and populates the internal | |
| clone | back to summary |
|---|---|
| public Object clone() Overrides java. Overrides Cloneable
| |
| equals | back to summary |
|---|---|
| public boolean equals(Object obj) Overrides java. Compares the specified object with this Implementation Specification This method performs an equality check with a notion of class
identity based on
| |
| format | back to summary |
|---|---|
| public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition status) Implements abstract java. Specialization of format. This method really calls
| |
| format | back to summary |
|---|---|
| pack-priv Format. Overrides java.
| |
| format | back to summary |
|---|---|
| public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition status) Implements abstract java. Returns pattern with formatted double.
| |
| format | back to summary |
|---|---|
| pack-priv Format. Overrides java.
| |
| getFormats | back to summary |
|---|---|
| public Object[] getFormats() Returns the formats of this ChoiceFormat.
| |
| getLimits | back to summary |
|---|---|
| public double[] getLimits() Returns the limits of this ChoiceFormat.
| |
| hashCode | back to summary |
|---|---|
| public int hashCode() Overrides java. Returns the hash code for this Implementation Specification This method calculates the hash code value using the values returned by
| |
| isStrict | back to summary |
|---|---|
| public boolean isStrict() Overrides java. Doc from java. Returns
| |
| nextDouble | back to summary |
|---|---|
| public static final double nextDouble(double d) Finds the least double greater than Used to make half-open intervals. Implementation Note This is equivalent to calling
| |
| nextDouble | back to summary |
|---|---|
| public static double nextDouble(double d, boolean positive) Finds the least double greater than Implementation Note This is equivalent to calling
| |
| parse | back to summary |
|---|---|
| public Number parse(String text, ParsePosition status) Implements abstract java. Parses the input text starting at the index given by the For example, var fmt = new ChoiceFormat("0#foo|1#bar|2#baz"); fmt.parse("baz", new ParsePosition(0)); // returns 2.0 fmt.parse("quux", new ParsePosition(0)); // returns NaN
| |
| previousDouble | back to summary |
|---|---|
| public static final double previousDouble(double d) Finds the greatest double less than Implementation Note This is equivalent to calling
| |
| readObject | back to summary |
|---|---|
| private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException Hides java. After reading an object from the input stream, do a simple verification to maintain class invariants.
| |
| setChoices | back to summary |
|---|---|
| public void setChoices(double[] limits, String[] formats) Set the choices to be used in formatting.
| |
| setChoicesImpl | back to summary |
|---|---|
| private void setChoicesImpl(double[] limits, String[] formats) Implementation of populating the | |
| setStrict | back to summary |
|---|---|
| public void setStrict(boolean strict) Overrides java. Doc from java. Change the leniency value for parsing. Parsing can either be strict or lenient, by default it is lenient.
| |
| stringToNum | back to summary |
|---|---|
| private static double stringToNum(String str) Converts a string value to its double representation; this is used to create the limit segment while applying a pattern. Handles "∞", as specified by the pattern syntax. | |
| toPattern | back to summary |
|---|---|
| public String toPattern() Returns a pattern
| |
| toString | back to summary |
|---|---|
| public String toString() Overrides java. Returns a string identifying this | |