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);
NumberFormat nf = NumberFormat.getInstance();
for (int i = 0; i < myNumber.length; ++i) {
output.println(nf.format(myNumber[i]) + "; ");
}
To format a number for a different Locale, specify it in the
call to getInstance.
You can also use aNumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
NumberFormat to parse numbers:
UsemyNumber = nf.parse(myString);
getInstance or getNumberInstance to get the
normal number format. Use getIntegerInstance to get an
integer number format. Use getCurrencyInstance to get the
currency number format. And use getPercentInstance 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 as
setMinimumFractionDigits.
If you want even more control over the format or parsing,
or want to give your users more control,
you can try casting the NumberFormat you get from the factory methods
to a DecimalFormat. This will work for the vast majority
of locales; just remember to put it in a try 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 the parse and format
methods with ParsePosition and FieldPosition to
allow you to:
FieldPosition in your format call, with
field = 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.
DecimalFormatChoiceFormatFieldPositionFieldPositionjava.lang.Number.
This implementation extracts the number's value using
for all integral type values that
can be converted to java.lang.Number.longValue()long without loss of information,
including BigInteger values with a
bit length of less than 64,
and for all other types. It
then calls
java.lang.Number.doubleValue()
or format(long,java.lang.StringBuffer,java.text.FieldPosition).
This may result in loss of magnitude information and precision for
format(double,java.lang.StringBuffer,java.text.FieldPosition)BigInteger and BigDecimal values.
number the number to formattoAppendTo the StringBuffer to which the formatted
text is to be appendedpos On input: an alignment field, if desired.
On output: the offsets of the alignment field.toAppendTojava.lang.IllegalArgumentException if number is
null or not an instance of Number.java.lang.NullPointerException if toAppendTo or
pos is nulljava.lang.ArithmeticException if rounding is needed with rounding
mode being set to RoundingMode.UNNECESSARYFieldPositionNumber.
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.
See the method for more information
on number parsing.
parse(java.lang.String,java.text.ParsePosition)
source A String, part of which should be parsed.pos A ParsePosition object with index and error
index information as described above.Number parsed from the string. In case of
error, returns null.java.lang.NullPointerException if pos is null.java.lang.ArithmeticException if rounding is needed with rounding
mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)java.lang.ArithmeticException if rounding is needed with rounding
mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)java.lang.ArithmeticException if rounding is needed with rounding
mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)java.lang.ArithmeticException if rounding is needed with rounding
mode being set to RoundingMode.UNNECESSARYFormat.format(java.lang.Object)
See the method for more information
on number parsing.
parse(java.lang.String,java.text.ParsePosition)
source A String whose beginning should be parsed.Number parsed from the string.ParseException if the beginning of the specified string
cannot be parsed.java.math.RoundingMode.HALF_EVEN) for formatting,
and to parse only the integer part of an input string (see isParseIntegerOnly()).
getRoundingMode()java.math.RoundingMode.HALF_EVEN) for formatting,
and to parse only the integer part of an input string (see isParseIntegerOnly()).
getRoundingMode()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 installed
NumberFormatProvider implementations.
It must contain at least a Locale instance equal to
Locale.US.
NumberFormat instances are available.setGroupingUsed(boolean)setMaximumIntegerDigits(int)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()setMinimumIntegerDigits(int)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()setMaximumFractionDigits(int)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()setMinimumFractionDigits(int)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()setCurrency.
The default implementation throws
UnsupportedOperationException.
nulljava.lang.UnsupportedOperationException if the number format class
doesn't implement currency formatting
The default implementation throws
UnsupportedOperationException.
currency the new currency to be used by this number formatjava.lang.UnsupportedOperationException if the number format class
doesn't implement currency formattingjava.lang.NullPointerException if currency is nulljava.math.RoundingMode used in this NumberFormat.
The default implementation of this method in NumberFormat
always throws java.lang.UnsupportedOperationException.
Subclasses which handle different rounding modes should override
this method.
RoundingMode used for this NumberFormat.java.lang.UnsupportedOperationException The default implementation
always throws this exceptionsetRoundingMode(java.math.RoundingMode)java.math.RoundingMode used in this NumberFormat.
The default implementation of this method in NumberFormat always
throws java.lang.UnsupportedOperationException.
Subclasses which handle different rounding modes should override
this method.
roundingMode The RoundingMode to be usedjava.lang.UnsupportedOperationException The default implementation
always throws this exceptionjava.lang.NullPointerException if roundingMode is nullgetRoundingMode()serialVersionOnStream is less than 1, indicating that
the stream was written by JDK 1.1,
set the int fields such as maximumIntegerDigits
to be equal to the byte fields such as maxIntegerDigits,
since the int fields were not present in JDK 1.1.
Finally, set serialVersionOnStream back to the maximum allowed value so that
default serialization will work properly if this object is streamed out again.
If minimumIntegerDigits is greater than
maximumIntegerDigits or minimumFractionDigits
is greater than maximumFractionDigits, then the stream data
is invalid and this method throws an InvalidObjectException.
In addition, if any of these values is negative, then this method throws
an InvalidObjectException.
isGroupingUsed()maxIntegerDigits must be greater than or equal to
minIntegerDigits.
Note: This field exists only for serialization
compatibility with JDK 1.1. In Java platform 2 v1.2 and higher, the new
int field maximumIntegerDigits is used instead.
When writing to a stream, maxIntegerDigits is set to
maximumIntegerDigits or Byte.MAX_VALUE,
whichever is smaller. When reading from a stream, this field is used
only if serialVersionOnStream is less than 1.
getMaximumIntegerDigits()minimumIntegerDigits must be less than or equal to
maximumIntegerDigits.
Note: This field exists only for serialization
compatibility with JDK 1.1. In Java platform 2 v1.2 and higher, the new
int field minimumIntegerDigits is used instead.
When writing to a stream, minIntegerDigits is set to
minimumIntegerDigits or Byte.MAX_VALUE,
whichever is smaller. When reading from a stream, this field is used
only if serialVersionOnStream is less than 1.
getMinimumIntegerDigits()maximumFractionDigits must be greater than or equal to
minimumFractionDigits.
Note: This field exists only for serialization
compatibility with JDK 1.1. In Java platform 2 v1.2 and higher, the new
int field maximumFractionDigits is used instead.
When writing to a stream, maxFractionDigits is set to
maximumFractionDigits or Byte.MAX_VALUE,
whichever is smaller. When reading from a stream, this field is used
only if serialVersionOnStream is less than 1.
getMaximumFractionDigits()minimumFractionDigits must be less than or equal to
maximumFractionDigits.
Note: This field exists only for serialization
compatibility with JDK 1.1. In Java platform 2 v1.2 and higher, the new
int field minimumFractionDigits is used instead.
When writing to a stream, minFractionDigits is set to
minimumFractionDigits or Byte.MAX_VALUE,
whichever is smaller. When reading from a stream, this field is used
only if serialVersionOnStream is less than 1.
getMinimumFractionDigits()maximumIntegerDigits must be greater than or equal to
minimumIntegerDigits.
getMaximumIntegerDigits()minimumIntegerDigits must be less than or equal to
maximumIntegerDigits.
getMinimumIntegerDigits()maximumFractionDigits must be greater than or equal to
minimumFractionDigits.
getMaximumFractionDigits()minimumFractionDigits must be less than or equal to
maximumFractionDigits.
getMinimumFractionDigits()NumberFormat present on the stream.
Possible values are:
int fields such as
maximumIntegerDigits were not present, and the byte
fields such as maxIntegerDigits are used instead.
byte fields such as maxIntegerDigits are ignored,
and the int fields such as maximumIntegerDigits
are used instead.
NumberFormat, the most recent format
(corresponding to the highest allowable serialVersionOnStream)
is always written.
java.io.InvalidObjectException if the constant could not be resolved.