public abstract classNumberFormatextendsFormat
NumberFormat
is the abstract base class for all number formats. This class provides the interface for formatting and parsing numbers.NumberFormat
also provides methods for determining which locales have number formats, and what their names are.NumberFormat
helps you to format and parse numbers for any locale. Your code can be completely independent of the locale conventions for decimal points, thousands-separators, or even the particular decimal digits used, or whether the number format is even decimal.
To format a number for the current Locale, use one of the factory class methods:
If you are formatting multiple numbers, it is more efficient to get the format and use it multiple times so that the system doesn't have to fetch the information about the local language and country conventions multiple times.myString = NumberFormat.getInstance().format(myNumber);
To format a number for a different Locale, specify it in the call toNumberFormat nf = NumberFormat.getInstance(); for (int i = 0; i < myNumber.length; ++i) { output.println(nf.format(myNumber[i]) + "; "); }
getInstance
.You can also use aNumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
NumberFormat
to parse numbers:UsemyNumber = nf.parse(myString);
getInstance
orgetNumberInstance
to get the normal number format. UsegetIntegerInstance
to get an integer number format. UsegetCurrencyInstance
to get the currency number format. And usegetPercentInstance
to get a format for displaying percentages. With this format, a fraction like 0.53 is displayed as 53%. You can also control the display of numbers with such methods assetMinimumFractionDigits
. If you want even more control over the format or parsing, or want to give your users more control, you can try casting theNumberFormat
you get from the factory methods to aDecimalFormat
. This will work for the vast majority of locales; just remember to put it in atry
block in case you encounter an unusual one.
NumberFormat and DecimalFormat are designed such that some controls work for formatting and others work for parsing. The following is the detailed description for each these control methods,
setParseIntegerOnly : only affects parsing, e.g. if true, "3456.78" → 3456 (and leaves the parse position just after index 6) if false, "3456.78" → 3456.78 (and leaves the parse position just after index 8) This is independent of formatting. If you want to not show a decimal point where there might be no digits after the decimal point, use setDecimalSeparatorAlwaysShown.
setDecimalSeparatorAlwaysShown : only affects formatting, and only where there might be no digits after the decimal point, such as with a pattern like "#,##0.##", e.g., if true, 3456.00 → "3,456." if false, 3456.00 → "3456" This is independent of parsing. If you want parsing to stop at the decimal point, use setParseIntegerOnly.
You can also use forms of theparse
andformat
methods withParsePosition
andFieldPosition
to allow you to:
FieldPosition
in your format call, withfield
=INTEGER_FIELD
. On output,getEndIndex
will be set to the offset between the last character of the integer and the decimal. Add (desiredSpaceCount - getEndIndex) spaces at the front of the string.getEndIndex
. Then move the pen by (desiredPixelWidth - widthToAlignmentPoint) before drawing the text. It also works where there is no decimal, but possibly additional characters at the end, e.g., with parentheses in negative numbers: "(12)" for -12.Number formats are generally 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.
DecimalFormat
,ChoiceFormat
,Serialized FormModifier and Type | Class | Description |
---|---|---|
static class | NumberFormat.Field | Defines constants that are used as attribute keys in the AttributedCharacterIterator returned fromNumberFormat.formatToCharacterIterator and as field identifiers inFieldPosition . |
Modifier and Type | Field | Description |
---|---|---|
static int | FRACTION_FIELD | Field constant used to construct a FieldPosition object. |
static int | INTEGER_FIELD | Field constant used to construct a FieldPosition object. |
Modifier | Constructor | Description |
---|---|---|
protected | NumberFormat() | Sole constructor. |
Modifier and Type | Method | Description |
---|---|---|
Object | clone() | Overrides Cloneable. |
boolean | equals(Object obj) | Overrides equals. |
String | format(double number) | Specialization of format. |
abstractStringBuffer | format(double number,StringBuffer toAppendTo,FieldPosition pos) | Specialization of format. |
String | format(long number) | Specialization of format. |
abstractStringBuffer | format(long number,StringBuffer toAppendTo,FieldPosition pos) | Specialization of format. |
StringBuffer | format(Object number,StringBuffer toAppendTo,FieldPosition pos) | Formats a number and appends the resulting text to the given string buffer. |
staticLocale[] | getAvailableLocales() | Returns an array of all locales for which the get*Instance methods of this class can return localized instances. |
Currency | getCurrency() | Gets the currency used by this number format when formatting currency values. |
staticNumberFormat | getCurrencyInstance() | Returns a currency format for the current default FORMAT locale. |
staticNumberFormat | getCurrencyInstance(Locale inLocale) | Returns a currency format for the specified locale. |
staticNumberFormat | getInstance() | Returns a general-purpose number format for the current default FORMAT locale. |
staticNumberFormat | getInstance(Locale inLocale) | Returns a general-purpose number format for the specified locale. |
staticNumberFormat | getIntegerInstance() | Returns an integer number format for the current default FORMAT locale. |
staticNumberFormat | getIntegerInstance(Locale inLocale) | Returns an integer number format for the specified locale. |
int | getMaximumFractionDigits() | Returns the maximum number of digits allowed in the fraction portion of a number. |
int | getMaximumIntegerDigits() | Returns the maximum number of digits allowed in the integer portion of a number. |
int | getMinimumFractionDigits() | Returns the minimum number of digits allowed in the fraction portion of a number. |
int | getMinimumIntegerDigits() | Returns the minimum number of digits allowed in the integer portion of a number. |
staticNumberFormat | getNumberInstance() | Returns a general-purpose number format for the current default FORMAT locale. |
staticNumberFormat | getNumberInstance(Locale inLocale) | Returns a general-purpose number format for the specified locale. |
staticNumberFormat | getPercentInstance() | Returns a percentage format for the current default FORMAT locale. |
staticNumberFormat | getPercentInstance(Locale inLocale) | Returns a percentage format for the specified locale. |
RoundingMode | getRoundingMode() | Gets the RoundingMode used in this NumberFormat. |
int | hashCode() | Overrides hashCode. |
boolean | isGroupingUsed() | Returns true if grouping is used in this format. |
boolean | isParseIntegerOnly() | Returns true if this format will parse numbers as integers only. |
Number | parse(String source) | Parses text from the beginning of the given string to produce a number. |
abstractNumber | parse(String source,ParsePosition parsePosition) | Returns a Long if possible (e.g., within the range [Long.MIN_VALUE, Long.MAX_VALUE] and with no decimals), otherwise a Double. |
Object | parseObject(String source,ParsePosition pos) | Parses text from a string to produce a Number . |
void | setCurrency(Currency currency) | Sets the currency used by this number format when formatting currency values. |
void | setGroupingUsed(boolean newValue) | Set whether or not grouping will be used in this format. |
void | setMaximumFractionDigits(int newValue) | Sets the maximum number of digits allowed in the fraction portion of a number. |
void | setMaximumIntegerDigits(int newValue) | Sets the maximum number of digits allowed in the integer portion of a number. |
void | setMinimumFractionDigits(int newValue) | Sets the minimum number of digits allowed in the fraction portion of a number. |
void | setMinimumIntegerDigits(int newValue) | Sets the minimum number of digits allowed in the integer portion of a number. |
void | setParseIntegerOnly(boolean value) | Sets whether or not numbers should be parsed as integers only. |
void | setRoundingMode(RoundingMode roundingMode) | Sets the RoundingMode used in this NumberFormat. |
format,formatToCharacterIterator,parseObject
public static final int INTEGER_FIELD
FieldPosition
,Constant Field Valuespublic static final int FRACTION_FIELD
FieldPosition
,Constant Field Valuesprotected NumberFormat()
public StringBuffer format(Object number,StringBuffer toAppendTo,FieldPosition pos)
Number
. This implementation extracts the number's value usingNumber.longValue()
for all integral type values that can be converted tolong
without loss of information, includingBigInteger
values with abit length
of less than 64, andNumber.doubleValue()
for all other types. It then callsformat(long,java.lang.StringBuffer,java.text.FieldPosition)
orformat(double,java.lang.StringBuffer,java.text.FieldPosition)
. This may result in loss of magnitude information and precision forBigInteger
andBigDecimal
values.
format
in class Format
number
- the number to formattoAppendTo
- theStringBuffer
to which the formatted text is to be appendedpos
- On input: an alignment field, if desired. On output: the offsets of the alignment field.toAppendTo
IllegalArgumentException
- ifnumber
is null or not an instance ofNumber
.NullPointerException
- iftoAppendTo
orpos
is nullArithmeticException
- if rounding is needed with rounding mode being set to RoundingMode.UNNECESSARYFieldPosition
public final Object parseObject(String source,ParsePosition pos)
Number
. The method attempts to parse text starting at the index given bypos
. If parsing succeeds, then the index ofpos
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 updatedpos
can be used to indicate the starting point for the next call to this method. If an error occurs, then the index ofpos
is not changed, the error index ofpos
is set to the index of the character where the error occurred, and null is returned.
See theparse(String, ParsePosition)
method for more information on number parsing.
parseObject
in class Format
source
- AString
, part of which should be parsed.pos
- AParsePosition
object with index and error index information as described above.Number
parsed from the string. In case of error, returns null.NullPointerException
- ifpos
is null.public final String format(double number)
number
- the double number to formatArithmeticException
- if rounding is needed with rounding mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)
public final String format(long number)
number
- the long number to formatArithmeticException
- if rounding is needed with rounding mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)
public abstract StringBuffer format(double number,StringBuffer toAppendTo,FieldPosition pos)
number
- the double number to formattoAppendTo
- the StringBuffer to which the formatted text is to be appendedpos
- the field positionArithmeticException
- if rounding is needed with rounding mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)
public abstract StringBuffer format(long number,StringBuffer toAppendTo,FieldPosition pos)
number
- the long number to formattoAppendTo
- the StringBuffer to which the formatted text is to be appendedpos
- the field positionArithmeticException
- if rounding is needed with rounding mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)
public abstract Number parse(String source,ParsePosition parsePosition)
source
- the String to parseparsePosition
- the parse positionisParseIntegerOnly()
,Format.parseObject(java.lang.String, java.text.ParsePosition)
public Number parse(String source) throwsParseException
See theparse(String, ParsePosition)
method for more information on number parsing.
source
- AString
whose beginning should be parsed.Number
parsed from the string.ParseException
- if the beginning of the specified string cannot be parsed.public boolean isParseIntegerOnly()
true
if numbers should be parsed as integers only;false
otherwisepublic void setParseIntegerOnly(boolean value)
value
-true
if numbers should be parsed as integers only;false
otherwiseisParseIntegerOnly()
public static final NumberFormat getInstance()
FORMAT
locale. This is the same as callinggetNumberInstance()
.NumberFormat
instance for general-purpose number formattingpublic static NumberFormat getInstance(Locale inLocale)
getNumberInstance(inLocale)
.inLocale
- the desired localeNumberFormat
instance for general-purpose number formattingpublic static final NumberFormat getNumberInstance()
FORMAT
locale.This is equivalent to callinggetNumberInstance(Locale.getDefault(Locale.Category.FORMAT))
.
NumberFormat
instance for general-purpose number formattingLocale.getDefault(java.util.Locale.Category)
,Locale.Category.FORMAT
public static NumberFormat getNumberInstance(Locale inLocale)
inLocale
- the desired localeNumberFormat
instance for general-purpose number formattingpublic static final NumberFormat getIntegerInstance()
FORMAT
locale. The returned number format is configured to round floating point numbers to the nearest integer using half-even rounding (seeRoundingMode.HALF_EVEN
) for formatting, and to parse only the integer part of an input string (seeisParseIntegerOnly
).This is equivalent to callinggetIntegerInstance(Locale.getDefault(Locale.Category.FORMAT))
.
getRoundingMode()
,Locale.getDefault(java.util.Locale.Category)
,Locale.Category.FORMAT
public static NumberFormat getIntegerInstance(Locale inLocale)
RoundingMode.HALF_EVEN
) for formatting, and to parse only the integer part of an input string (seeisParseIntegerOnly
).inLocale
- the desired localegetRoundingMode()
public static final NumberFormat getCurrencyInstance()
FORMAT
locale.This is equivalent to callinggetCurrencyInstance(Locale.getDefault(Locale.Category.FORMAT))
.
NumberFormat
instance for currency formattingLocale.getDefault(java.util.Locale.Category)
,Locale.Category.FORMAT
public static NumberFormat getCurrencyInstance(Locale inLocale)
inLocale
- the desired localeNumberFormat
instance for currency formattingpublic static final NumberFormat getPercentInstance()
FORMAT
locale.This is equivalent to callinggetPercentInstance(Locale.getDefault(Locale.Category.FORMAT))
.
NumberFormat
instance for percentage formattingLocale.getDefault(java.util.Locale.Category)
,Locale.Category.FORMAT
public static NumberFormat getPercentInstance(Locale inLocale)
inLocale
- the desired localeNumberFormat
instance for percentage formattingpublic static Locale[] getAvailableLocales()
get*Instance
methods of this class can return localized instances. The returned array represents the union of locales supported by the Java runtime and by installedNumberFormatProvider
implementations. It must contain at least aLocale
instance equal toLocale.US
.NumberFormat
instances are available.public int hashCode()
hashCode
in class Object
Object.equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
public boolean equals(Object obj)
equals
in class Object
obj
- the reference object with which to compare.true
if this object is the same as the obj argument;false
otherwise.Object.hashCode()
,HashMap
public Object clone()
public boolean isGroupingUsed()
true
if grouping is used;false
otherwisesetGroupingUsed(boolean)
public void setGroupingUsed(boolean newValue)
newValue
-true
if grouping is used;false
otherwiseisGroupingUsed()
public int getMaximumIntegerDigits()
setMaximumIntegerDigits(int)
public void setMaximumIntegerDigits(int newValue)
newValue
- the maximum number of integer digits to be shown; if less than zero, then zero is used. The concrete subclass may enforce an upper limit to this value appropriate to the numeric type being formatted.getMaximumIntegerDigits()
public int getMinimumIntegerDigits()
setMinimumIntegerDigits(int)
public void setMinimumIntegerDigits(int newValue)
newValue
- the minimum number of integer digits to be shown; if less than zero, then zero is used. The concrete subclass may enforce an upper limit to this value appropriate to the numeric type being formatted.getMinimumIntegerDigits()
public int getMaximumFractionDigits()
setMaximumFractionDigits(int)
public void setMaximumFractionDigits(int newValue)
newValue
- the maximum number of fraction digits to be shown; if less than zero, then zero is used. The concrete subclass may enforce an upper limit to this value appropriate to the numeric type being formatted.getMaximumFractionDigits()
public int getMinimumFractionDigits()
setMinimumFractionDigits(int)
public void setMinimumFractionDigits(int newValue)
newValue
- the minimum number of fraction digits to be shown; if less than zero, then zero is used. The concrete subclass may enforce an upper limit to this value appropriate to the numeric type being formatted.getMinimumFractionDigits()
public Currency getCurrency()
setCurrency
. The default implementation throwsUnsupportedOperationException
.
null
UnsupportedOperationException
- if the number format class doesn't implement currency formattingpublic void setCurrency(Currency currency)
The default implementation throwsUnsupportedOperationException
.
currency
- the new currency to be used by this number formatUnsupportedOperationException
- if the number format class doesn't implement currency formattingNullPointerException
- ifcurrency
is nullpublic RoundingMode getRoundingMode()
RoundingMode
used in this NumberFormat. The default implementation of this method in NumberFormat always throwsUnsupportedOperationException
. Subclasses which handle different rounding modes should override this method.RoundingMode
used for this NumberFormat.UnsupportedOperationException
- The default implementation always throws this exceptionsetRoundingMode(RoundingMode)
public void setRoundingMode(RoundingMode roundingMode)
RoundingMode
used in this NumberFormat. The default implementation of this method in NumberFormat always throwsUnsupportedOperationException
. Subclasses which handle different rounding modes should override this method.roundingMode
- TheRoundingMode
to be usedUnsupportedOperationException
- The default implementation always throws this exceptionNullPointerException
- ifroundingMode
is nullgetRoundingMode()