Class CompactNumberFormat
- All Implemented Interfaces:
-
Serializable,Cloneable
public final class CompactNumberFormat extends NumberFormat
CompactNumberFormat is a concrete subclass of NumberFormat that formats a decimal number in its compact form. The compact number formatting is designed for the environment where the space is limited, and the formatted string can be displayed in that limited space. It is defined by LDML's specification for Compact Number Formats. A compact number formatting refers to the representation of a number in a shorter form, based on the patterns provided for a given locale.
For example:
In the US locale, 1000 can be formatted as "1K", and 1000000 as "1M", depending upon the style used.
In the "hi_IN" locale, 1000 can be formatted as "1 हà¤à¤¼à¤¾à¤°", and 50000000 as "5 à¤.", depending upon the style used.
To obtain a CompactNumberFormat for a locale, use one of the factory methods given by NumberFormat for compact number formatting. For example, NumberFormat.getCompactNumberInstance(Locale, Style).
NumberFormat fmt = NumberFormat.getCompactNumberInstance(
new Locale("hi", "IN"), NumberFormat.Style.SHORT);
String result = fmt.format(1000);
Style
A number can be formatted in the compact forms with two different styles, SHORT and LONG. Use NumberFormat.getCompactNumberInstance(Locale, Style) for formatting and parsing a number in SHORT or LONG compact form, where the given Style parameter requests the desired format. A SHORT style compact number instance in the US locale formats 10000 as "10K". However, a LONG style instance in same locale formats 10000 as "10 thousand".
Compact Number Patterns
The compact number patterns are represented in a series of patterns where each pattern is used to format a range of numbers. An example of SHORT styled compact number patterns for the US locale is {"", "", "", "0K",
"00K", "000K", "0M", "00M", "000M", "0B", "00B", "000B", "0T", "00T", "000T"}, ranging from 100 to 1014. There can be any number of patterns and they are strictly index based starting from the range 100. For example, in the above patterns, pattern at index 3 ("0K") is used for formatting number >= 1000 and number < 10000, pattern at index 4 ("00K") is used for formatting number >= 10000 and number < 100000 and so on. In most of the locales, patterns with the range 100-102 are empty strings, which implicitly means a special pattern "0". A special pattern "0" is used for any range which does not contain a compact pattern. This special pattern can appear explicitly for any specific range, or considered as a default pattern for an empty string.
A compact pattern contains a positive and negative subpattern separated by a subpattern boundary character ';' (U+003B), for example, "0K;-0K". Each subpattern has a prefix, minimum integer digits, and suffix. The negative subpattern is optional, if absent, then the positive subpattern prefixed with the minus sign ('-' U+002D HYPHEN-MINUS) is used as the negative subpattern. That is, "0K" alone is equivalent to "0K;-0K". If there is an explicit negative subpattern, it serves only to specify the negative prefix and suffix. The number of minimum integer digits, and other characteristics are all the same as the positive pattern. That means that "0K;-00K" produces precisely the same behavior as "0K;-0K".
Many characters in a compact pattern are taken literally, they are matched during parsing and output unchanged during formatting. Special characters, on the other hand, stand for other characters, strings, or classes of characters. They must be quoted, using single quote ' (U+0027) unless noted otherwise, if they are to appear in the prefix or suffix as literals. For example, 0à¤'.'.
Plurals
In case some localization requires compact number patterns to be different for plurals, each singular and plural pattern can be enumerated within a pair of curly brackets '{' (U+007B) and '}' (U+007D), separated by a space ' ' (U+0020). If this format is used, each pattern needs to be prepended by its count, followed by a single colon ':' (U+003A). If the pattern includes spaces literally, they must be quoted.
For example, the compact number pattern representing millions in German locale can be specified as "{one:0' 'Million other:0' 'Millionen}". The count follows LDML's Language Plural Rules.
A compact pattern has the following syntax:
Pattern:
SimplePattern
'{' PluralPattern [' ' PluralPattern]optional '}'
SimplePattern:
PositivePattern
PositivePattern [; NegativePattern]optional
PluralPattern:
Count:SimplePattern
Count:
"zero" / "one" / "two" / "few" / "many" / "other"
PositivePattern:
Prefixoptional MinimumInteger Suffixoptional
NegativePattern:
Prefixoptional MinimumInteger Suffixoptional
Prefix:
Any Unicode characters except \uFFFE, \uFFFF, and
special characters.
Suffix:
Any Unicode characters except \uFFFE, \uFFFF, and
special characters.
MinimumInteger:
0
0 MinimumInteger
Formatting
The default formatting behavior returns a formatted string with no fractional digits, however users can use thesetMinimumFractionDigits(int) method to include the fractional part. The number 1000.0 or 1000 is formatted as "1K" not "1.00K" (in the US locale). For this reason, the patterns provided for formatting contain only the minimum integer digits, prefix and/or suffix, but no fractional part. For example, patterns used are {"", "", "", 0K, 00K, ...}. If the pattern selected for formatting a number is "0" (special pattern), either explicit or defaulted, then the general number formatting provided by DecimalFormat for the specified locale is used. Parsing
The default parsing behavior does not allow a grouping separator until grouping used is set totrue by using setGroupingUsed(boolean). The parsing of the fractional part depends on the isParseIntegerOnly(). For example, if the parse integer only is set to true, then the fractional part is skipped. Rounding
CompactNumberFormat provides rounding modes defined in RoundingMode for formatting. By default, it uses RoundingMode.HALF_EVEN.- Since:
- 12
- See Also:
Nested Class Summary
Nested classes/interfaces declared in class java.text.NumberFormat
NumberFormat.Field, NumberFormat.Style
Field Summary
Fields declared in class java.text.NumberFormat
FRACTION_FIELD, INTEGER_FIELD
Constructor Summary
| Constructor | Description |
|---|---|
CompactNumberFormat |
Creates a CompactNumberFormat using the given decimal pattern, decimal format symbols and compact patterns. |
CompactNumberFormat |
Creates a CompactNumberFormat using the given decimal pattern, decimal format symbols, compact patterns, and plural rules. |
Method Summary
| Modifier and Type | Method | Description |
|---|---|---|
CompactNumberFormat |
clone() |
Creates and returns a copy of this CompactNumberFormat instance. |
boolean |
equals |
Checks if this CompactNumberFormat is equal to the specified obj. |
StringBuffer |
format |
Formats a double to produce a string representing its compact form. |
StringBuffer |
format |
Formats a long to produce a string representing its compact form. |
final StringBuffer |
format |
Formats a number to produce a string representing its compact form. |
AttributedCharacterIterator |
formatToCharacterIterator |
Formats an Object producing an AttributedCharacterIterator. |
int |
getGroupingSize() |
Returns the grouping size. |
RoundingMode |
getRoundingMode() |
Gets the RoundingMode used in this CompactNumberFormat. |
int |
hashCode() |
Returns the hash code for this CompactNumberFormat instance. |
boolean |
isGroupingUsed() |
Returns true if grouping is used in this format. |
boolean |
isParseBigDecimal() |
Returns whether the parse(String, ParsePosition) method returns BigDecimal. |
boolean |
isParseIntegerOnly() |
Returns true if this format parses only an integer from the number component of a compact number. |
Number |
parse |
Parses a compact number from a string to produce a Number. |
void |
setGroupingSize |
Sets the grouping size. |
void |
setGroupingUsed |
Sets whether or not grouping will be used in this format. |
void |
setMaximumFractionDigits |
Sets the maximum number of digits allowed in the fraction portion of a number. |
void |
setMaximumIntegerDigits |
Sets the maximum number of digits allowed in the integer portion of a number. |
void |
setMinimumFractionDigits |
Sets the minimum number of digits allowed in the fraction portion of a number. |
void |
setMinimumIntegerDigits |
Sets the minimum number of digits allowed in the integer portion of a number. |
void |
setParseBigDecimal |
Sets whether the parse(String, ParsePosition) method returns BigDecimal. |
void |
setParseIntegerOnly |
Sets whether or not this format parses only an integer from the number component of a compact number. |
void |
setRoundingMode |
Sets the RoundingMode used in this CompactNumberFormat. |
Methods declared in class java.text.NumberFormat
format, format, getAvailableLocales, getCompactNumberInstance, getCompactNumberInstance, getCurrency, getCurrencyInstance, getCurrencyInstance, getInstance, getInstance, getIntegerInstance, getIntegerInstance, getMaximumFractionDigits, getMaximumIntegerDigits, getMinimumFractionDigits, getMinimumIntegerDigits, getNumberInstance, getNumberInstance, getPercentInstance, getPercentInstance, parse, parseObject, setCurrency
Methods declared in class java.text.Format
format, parseObject
Constructor Details
CompactNumberFormat
public CompactNumberFormat(String decimalPattern, DecimalFormatSymbols symbols, String[] compactPatterns)
CompactNumberFormat using the given decimal pattern, decimal format symbols and compact patterns. To obtain the instance of CompactNumberFormat with the standard compact patterns for a Locale and Style, it is recommended to use the factory methods given by NumberFormat for compact number formatting. For example, NumberFormat.getCompactNumberInstance(Locale, Style).- Parameters:
-
decimalPattern- a decimal pattern for general number formatting -
symbols- the set of symbols to be used -
compactPatterns- an array of compact number patterns - Throws:
-
NullPointerException- if any of the given arguments isnull -
IllegalArgumentException- if the givendecimalPatternor thecompactPatternsarray contains an invalid pattern or if anullappears in the array of compact patterns - See Also:
CompactNumberFormat
public CompactNumberFormat(String decimalPattern, DecimalFormatSymbols symbols, String[] compactPatterns, String pluralRules)
CompactNumberFormat using the given decimal pattern, decimal format symbols, compact patterns, and plural rules. To obtain the instance of CompactNumberFormat with the standard compact patterns for a Locale, Style, and pluralRules, it is recommended to use the factory methods given by NumberFormat for compact number formatting. For example, NumberFormat.getCompactNumberInstance(Locale, Style).- Parameters:
-
decimalPattern- a decimal pattern for general number formatting -
symbols- the set of symbols to be used -
compactPatterns- an array of compact number patterns -
pluralRules- a String designating plural rules which associate theCountkeyword, such as "one", and the actual integer number. Its syntax is defined in Unicode Consortium's Plural rules syntax - Throws:
-
NullPointerException- if any of the given arguments isnull -
IllegalArgumentException- if the givendecimalPattern, thecompactPatternsarray contains an invalid pattern, anullappears in the array of compact patterns, or if the givenpluralRulescontains an invalid syntax - Since:
- 14
- See Also:
Method Details
format
public final StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition fieldPosition)
Number.- Overrides:
-
formatin classNumberFormat - Parameters:
-
number- the number to format -
toAppendTo- theStringBufferto which the formatted text is to be appended -
fieldPosition- keeps track on the position of the field within the returned string. For example, for formatting a number123456789in theUS locale, if the givenfieldPositionisNumberFormat.INTEGER_FIELD, the begin index and end index offieldPositionwill be set to 0 and 3, respectively for the output string123M. Similarly, positions of the prefix and the suffix fields can be obtained usingNumberFormat.Field.PREFIXandNumberFormat.Field.SUFFIXrespectively. - Returns:
- the
StringBufferpassed in astoAppendTo - Throws:
-
IllegalArgumentException- ifnumberisnullor not an instance ofNumber -
NullPointerException- iftoAppendToorfieldPositionisnull -
ArithmeticException- if rounding is needed with rounding mode being set toRoundingMode.UNNECESSARY - See Also:
format
public StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition)
- Specified by:
-
formatin classNumberFormat - Parameters:
-
number- the double number to format -
result- where the text is to be appended -
fieldPosition- keeps track on the position of the field within the returned string. For example, to format a number1234567.89in theUS localeif the givenfieldPositionisNumberFormat.INTEGER_FIELD, the begin index and end index offieldPositionwill be set to 0 and 1, respectively for the output string1M. Similarly, positions of the prefix and the suffix fields can be obtained usingNumberFormat.Field.PREFIXandNumberFormat.Field.SUFFIXrespectively. - Returns:
- the
StringBufferpassed in asresult - Throws:
-
NullPointerException- ifresultorfieldPositionisnull -
ArithmeticException- if rounding is needed with rounding mode being set toRoundingMode.UNNECESSARY - See Also:
format
public StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition)
- Specified by:
-
formatin classNumberFormat - Parameters:
-
number- the long number to format -
result- where the text is to be appended -
fieldPosition- keeps track on the position of the field within the returned string. For example, to format a number123456789in theUS locale, if the givenfieldPositionisNumberFormat.INTEGER_FIELD, the begin index and end index offieldPositionwill be set to 0 and 3, respectively for the output string123M. Similarly, positions of the prefix and the suffix fields can be obtained usingNumberFormat.Field.PREFIXandNumberFormat.Field.SUFFIXrespectively. - Returns:
- the
StringBufferpassed in asresult - Throws:
-
NullPointerException- ifresultorfieldPositionisnull -
ArithmeticException- if rounding is needed with rounding mode being set toRoundingMode.UNNECESSARY - See Also:
formatToCharacterIterator
public AttributedCharacterIterator formatToCharacterIterator(Object obj)
AttributedCharacterIterator. The returned AttributedCharacterIterator can be used to build the resulting string, as well as to determine information about the resulting string. Each attribute key of the AttributedCharacterIterator will be of type NumberFormat.Field, with the attribute value being the same as the attribute key. The prefix and the suffix parts of the returned iterator (if present) are represented by the attributes NumberFormat.Field.PREFIX and NumberFormat.Field.SUFFIX respectively.
- Overrides:
-
formatToCharacterIteratorin classFormat - Parameters:
-
obj- The object to format - Returns:
- an
AttributedCharacterIteratordescribing the formatted value - Throws:
-
NullPointerException- if obj is null -
IllegalArgumentException- when the Format cannot format the given object -
ArithmeticException- if rounding is needed with rounding mode being set toRoundingMode.UNNECESSARY
parse
public Number parse(String text, ParsePosition pos)
Number. The method attempts to parse text starting at the index given by pos. If parsing succeeds, then the index of pos is updated to the index after the last character used (parsing does not necessarily use all characters up to the end of the string), and the parsed number is returned. The updated pos can be used to indicate the starting point for the next call to this method. If an error occurs, then the index of pos is not changed, the error index of pos is set to the index of the character where the error occurred, and null is returned.
The value is the numeric part in the given text multiplied by the numeric equivalent of the affix attached (For example, "K" = 1000 in US locale). The subclass returned depends on the value of isParseBigDecimal().
- If
isParseBigDecimal()is false (the default), most integer values are returned asLongobjects, no matter how they are written:"17K"and"17.000K"both parse toLong.valueOf(17000). If the value cannot fit intoLong, then the result is returned asDouble. This includes values with a fractional part, infinite values,NaN, and the value -0.0.Callers may use the
NumbermethodsdoubleValue,longValue, etc., to obtain the type they want. - If
isParseBigDecimal()is true, values are returned asBigDecimalobjects. The special cases negative and positive infinity and NaN are returned asDoubleinstances holding the values of the correspondingDoubleconstants.
CompactNumberFormat parses all Unicode characters that represent decimal digits, as defined by Character.digit(). In addition, CompactNumberFormat also recognizes as digits the ten consecutive characters starting with the localized zero digit defined in the DecimalFormatSymbols object.
CompactNumberFormat parse does not allow parsing scientific notations. For example, parsing a string "1.05E4K" in US locale breaks at character 'E' and returns 1.05.
- Specified by:
-
parsein classNumberFormat - Parameters:
-
text- the string to be parsed -
pos- aParsePositionobject with index and error index information as described above - Returns:
- the parsed value, or
nullif the parse fails - Throws:
-
NullPointerException- iftextorposis null - See Also:
setMaximumIntegerDigits
public void setMaximumIntegerDigits(int newValue)
newValue > 309, then the maximum integer digits count is set to 309. Negative input values are replaced with 0.- Overrides:
-
setMaximumIntegerDigitsin classNumberFormat - Parameters:
-
newValue- the maximum number of integer digits to be shown - See Also:
setMinimumIntegerDigits
public void setMinimumIntegerDigits(int newValue)
newValue > 309, then the minimum integer digits count is set to 309. Negative input values are replaced with 0.- Overrides:
-
setMinimumIntegerDigitsin classNumberFormat - Parameters:
-
newValue- the minimum number of integer digits to be shown - See Also:
setMinimumFractionDigits
public void setMinimumFractionDigits(int newValue)
newValue > 340, then the minimum fraction digits count is set to 340. Negative input values are replaced with 0.- Overrides:
-
setMinimumFractionDigitsin classNumberFormat - Parameters:
-
newValue- the minimum number of fraction digits to be shown - See Also:
setMaximumFractionDigits
public void setMaximumFractionDigits(int newValue)
newValue > 340, then the maximum fraction digits count is set to 340. Negative input values are replaced with 0.- Overrides:
-
setMaximumFractionDigitsin classNumberFormat - Parameters:
-
newValue- the maximum number of fraction digits to be shown - See Also:
getRoundingMode
public RoundingMode getRoundingMode()
RoundingMode used in this CompactNumberFormat.- Overrides:
-
getRoundingModein classNumberFormat - Returns:
- the
RoundingModeused for thisCompactNumberFormat - See Also:
setRoundingMode
public void setRoundingMode(RoundingMode roundingMode)
RoundingMode used in this CompactNumberFormat.- Overrides:
-
setRoundingModein classNumberFormat - Parameters:
-
roundingMode- theRoundingModeto be used - Throws:
-
NullPointerException- ifroundingModeisnull - See Also:
getGroupingSize
public int getGroupingSize()
"12,347 trillion" for the US locale, the grouping size is 3.- Returns:
- the grouping size
- See Also:
setGroupingSize
public void setGroupingSize(int newValue)
"12,347 trillion" for the US locale, the grouping size is 3. The grouping size must be greater than or equal to zero and less than or equal to 127.- Parameters:
-
newValue- the new grouping size - Throws:
-
IllegalArgumentException- ifnewValueis negative or larger than 127 - See Also:
isGroupingUsed
public boolean isGroupingUsed()
12346567890987654 can be formatted as "12,347 trillion" in the US locale. The grouping separator is locale dependent.- Overrides:
-
isGroupingUsedin classNumberFormat - Returns:
-
trueif grouping is used;falseotherwise - See Also:
setGroupingUsed
public void setGroupingUsed(boolean newValue)
- Overrides:
-
setGroupingUsedin classNumberFormat - Parameters:
-
newValue-trueif grouping is used;falseotherwise - See Also:
isParseIntegerOnly
public boolean isParseIntegerOnly()
US locale, if this method returns true, the string "1234.78 thousand" would be parsed as the value 1234000 (1234 (integer part) * 1000 (thousand)) and the fractional part would be skipped. The exact format accepted by the parse operation is locale dependent.- Overrides:
-
isParseIntegerOnlyin classNumberFormat - Returns:
-
trueif compact numbers should be parsed as integers only;falseotherwise
setParseIntegerOnly
public void setParseIntegerOnly(boolean value)
- Overrides:
-
setParseIntegerOnlyin classNumberFormat - Parameters:
-
value-trueif compact numbers should be parsed as integers only;falseotherwise - See Also:
isParseBigDecimal
public boolean isParseBigDecimal()
parse(String, ParsePosition) method returns BigDecimal. The default value is false.- Returns:
-
trueif the parse method returns BigDecimal;falseotherwise - See Also:
setParseBigDecimal
public void setParseBigDecimal(boolean newValue)
parse(String, ParsePosition) method returns BigDecimal.- Parameters:
-
newValue-trueif the parse method returns BigDecimal;falseotherwise - See Also:
equals
public boolean equals(Object obj)
CompactNumberFormat is equal to the specified obj. The objects of type CompactNumberFormat are compared, other types return false; obeys the general contract of Object.equals.- Overrides:
-
equalsin classNumberFormat - Parameters:
-
obj- the object to compare with - Returns:
- true if this is equal to the other
CompactNumberFormat - See Also:
hashCode
public int hashCode()
CompactNumberFormat instance.- Overrides:
-
hashCodein classNumberFormat - Returns:
- hash code for this
CompactNumberFormat - See Also:
clone
public CompactNumberFormat clone()
CompactNumberFormat instance.- Overrides:
-
clonein classNumberFormat - Returns:
- a clone of this instance
- See Also:
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/CompactNumberFormat.html