java.lang.Object java.text.Format java.text.NumberFormat java.text.DecimalFormat
public class DecimalFormat
DecimalFormat
是 NumberFormat
的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
要获取具体语言环境的 NumberFormat
(包括默认语言环境),可调用 NumberFormat
的某个工厂方法,如 getInstance()
。通常不直接调用 DecimalFormat
的构造方法,因为 NumberFormat
的工厂方法可能返回不同于 DecimalFormat
的子类。如果需要自定义格式对象,可执行:
NumberFormat f = NumberFormat.getInstance(loc); if (f instanceof DecimalFormat) { ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true); }
DecimalFormat
包含一个模式 和一组符号。可直接使用 applyPattern()
或间接使用 API 方法来设置模式。符号存储在 DecimalFormatSymbols
对象中。使用 NumberFormat
工厂方法时,可从已本地化的 ResourceBundle
中读取模式和符号。
DecimalFormat
模式具有下列语法:
模式: 正数模式 正数模式;负数模式 正数模式: 前缀opt 数字后缀opt 负数模式: 前缀opt 数字后缀opt 前缀: 除 \uFFFE、\uFFFF 和特殊字符以外的所有 Unicode 字符 后缀: 除 \uFFFE、\uFFFF 和特殊字符以外的所有 Unicode 字符 数字: 整数指数opt 整数。小数指数opt 整数: 最小整数 # # 整数 # , 整数 最小整数: 0 0 最小整数 0 , 最小整数 小数: 最小小数opt 可选小数opt 最小小数: 0 最小小数opt 可选小数: # 可选小数opt 指数: E 最小指数 最小指数: 0 最小指数opt
DecimalFormat
模式包含正数和负数子模式,例如 "#,##0.00;(#,##0.00)"
。每个子模式都有前缀、数字部分和后缀。负数子模式是可选的;如果存在,则将用已本地化的减号(在多数语言环境中是 '-'
)作为前缀的正数子模式用作负数子模式。也就是说,单独的 "0.00"
等效于 "0.00;-0.00"
。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;数字位数、最小位数,其他特征都与正数模式相同。这意味着 "#,##0.0#;(#)"
的行为与 "#,##0.0#;(#,##0.0#)"
完全相同。
用于无穷大值、数字、千位分隔符、小数分隔符等的前缀、后缀和各种符号可设置为任意值,并且能在格式化期间正确显示。但是,必须注意不要让符号和字符串发生冲突,否则解析是不可靠的。例如,为了让 DecimalFormat.parse()
能够区分正数和负数,正数和负数前缀或后缀必须是不同的。(如果它们相同,则 DecimalFormat
的行为就如同未指定负数子模式一样。)另一个示例是小数分隔符和千位分隔符应该是不同的字符,否则将不可能进行解析。
分组分隔符通常用于千位,但是在某些国家/地区中它用于分隔万位。分组大小是分组字符之间的固定数字位数,例如 100,000,000 是 3,而 1,0000,0000 则是 4。如果使用具有多个分组字符的模式,则最后一个分隔符和整数结尾之间的间隔才是使用的分组大小。所以 "#,##,###,####"
== "######,####"
== "##,####,####"
。
模式中的很多字符都是按字面解释的;在解析期间对其进行匹配,在格式化期间则不经改变地输出。另一方面,特殊字符代表了其他字符、字符串或字符类。如果要将其作为字面量出现在前缀或后缀中,那么除非另行说明,否则必须对其加引号。
下列字符用在非本地化的模式中。已本地化的模式使用从此格式器的 DecimalFormatSymbols
对象中获得的相应字符,这些字符已失去其特殊状态。两种例外是货币符号和引号,不将其本地化。
符号 位置 本地化? 含义 0
数字 是 阿拉伯数字 #
数字字 是 阿拉伯数字,如果不存在则显示为 0 .
数字 是 小数分隔符或货币小数分隔符 -
数字 是 减号 ,
数字 是 分组分隔符 E
数字 是 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 ;
子模式边界 是 分隔正数和负数子模式 %
前缀或后缀 是 乘以 100 并显示为百分数 \u2030
前缀或后缀 是 乘以 1000 并显示为千分数 ¤
(\u00A4
)前缀或后缀 否 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 '
前缀或后缀 否 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#"
将 123 格式化为"#123"
。要创建单引号本身,请连续使用两个单引号:"# o''clock"
。
科学计数法中的数表示为一个尾数和一个 10 的几次幂的乘积,例如可将 1234 表示为 1.234 x 10^3。尾数的范围通常是 1.0 <= x < 10.0,但并非必需如此。可指示 DecimalFormat
仅通过某个模式 来格式化和解析科学计数法表示的数;目前没有创建科学计数法格式的工厂方法。在这个模式中,指数字符后面紧跟着一个或多个数字字符即指示科学计数法。示例:"0.###E0"
将数字 1234 格式化为 "1.234E3"
。
"0.###E0 m/s"
等此类的模式。 "##0.#####E0"
。使用此模式时,数 12345 格式化为 "12.345E3"
,123456 则格式化为 "123.456E3"
。 "00.###E0"
格式化 0.00123 时得到 "12.3E-4"
。 "##0.##E0"
格式化 12345 得到 "12.3E3"
。要显示所有位数,请将有效位数计数设置为零。有效位数不会影响解析。 DecimalFormat
提供
RoundingMode
中定义的舍入模式进行格式化。默认情况下,它使用
RoundingMode.HALF_EVEN
。
DecimalFormat
使用
DecimalFormatSymbols
对象中所定义的、从已本地化的阿拉伯数字 0 开始的 10 个连续字符作为阿拉伯数字。为了进行解析,可识别
Character.digit
所定义的这些阿拉伯数字和所有 Unicode 十进制阿拉伯数字。
NaN
被格式化为一个字符串,通常具有单个字符 \uFFFD
。此字符串由 DecimalFormatSymbols
对象所确定。这是唯一不使用前缀和后缀的值。
无穷大的值被格式化为一个字符串,通常具有单个字符 \u221E
,具有正数或负数前缀和后缀。无穷大值的字符串由 DecimalFormatSymbols
对象所确定。
将负零("-0"
)解析为
isParseBigDecimal()
为 true,则为 BigDecimal(0)
, isParseBigDecimal()
为 false 并且 isParseIntegerOnly()
为 true,则为 Long(0)
, isParseBigDecimal()
和 isParseIntegerOnly()
均为 false,则为 Double(-0.0)
。 DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。
// Print out a number using the localized number, integer, currency, // and percent format for each locale Locale[] locales = NumberFormat.getAvailableLocales(); double myNumber = -1234.56; NumberFormat form; for (int j=0; j<4; ++j) { System.out.println("FORMAT"); for (int i = 0; i < locales.length; ++i) { if (locales[i].getCountry().length() == 0) { continue; // Skip language-only locales } System.out.print(locales[i].getDisplayName()); switch (j) { case 0: form = NumberFormat.getInstance(locales[i]); break; case 1: form = NumberFormat.getIntegerInstance(locales[i]); break; case 2: form = NumberFormat.getCurrencyInstance(locales[i]); break; default: form = NumberFormat.getPercentInstance(locales[i]); break; } if (form instanceof DecimalFormat) { System.out.print(": " + ((DecimalFormat) form).toPattern()); } System.out.print(" -> " + form.format(myNumber)); try { System.out.println(" -> " + form.parse(form.format(myNumber))); } catch (ParseException e) {} } }
嵌套类摘要 |
---|
从类 java.text.NumberFormat 继承的嵌套类/接口 |
---|
NumberFormat.Field |
字段摘要 |
---|
从类 java.text.NumberFormat 继承的字段 |
---|
FRACTION_FIELD, INTEGER_FIELD |
构造方法摘要 | |
---|---|
DecimalFormat() 使用默认模式和默认语言环境的符号创建一个 DecimalFormat。 |
|
DecimalFormat(String pattern) 使用给定的模式和默认语言环境的符号创建一个 DecimalFormat。 |
|
DecimalFormat(String pattern, DecimalFormatSymbols symbols) 使用给定的模式和符号创建一个 DecimalFormat。 |
方法摘要 | |
---|---|
void |
applyLocalizedPattern(String pattern) 将给定的模式应用于此 Format 对象。 |
void |
applyPattern(String pattern) 将给定的模式应用于此 Format 对象。 |
Object |
clone() 标准重写;没有语义上的变化。 |
boolean |
equals(Object obj) 重写 equals |
StringBuffer |
format(double number, StringBuffer result, FieldPosition fieldPosition) 格式化一个 double 值,以生成一个字符串。 |
StringBuffer |
format(long number, StringBuffer result, FieldPosition fieldPosition) 格式化一个 long 值,以生成一个字符串。 |
StringBuffer |
format(Object number, StringBuffer toAppendTo, FieldPosition pos) 格式化一个数,并将所得文本追加到给定的字符串缓冲区。 |
AttributedCharacterIterator |
formatToCharacterIterator(Object obj) 格式化一个 Object,以生成一个 AttributedCharacterIterator 。 |
Currency |
getCurrency() 获取格式化货币值时,此十进制格式使用的货币。 |
DecimalFormatSymbols |
getDecimalFormatSymbols() 返回小数格式符号的一个副本,通常程序员或用户不改变此副本。 |
int |
getGroupingSize() 返回分组大小。 |
int |
getMaximumFractionDigits() 获取某个数的小数部分中所允许的最大数字位数。 |
int |
getMaximumIntegerDigits() 获取某个数的整数部分中所允许的最大数字位数。 |
int |
getMinimumFractionDigits() 获取某个数的小数部分中所允许的最小数字位数。 |
int |
getMinimumIntegerDigits() 获取某个数的整数部分中所允许的最小数字位数。 |
int |
getMultiplier() 获取百分数、千分数和类似格式中使用的乘数。 |
String |
getNegativePrefix() 获取负数前缀。 |
String |
getNegativeSuffix() 获取负数后缀。 |
String |
getPositivePrefix() 获取正数前缀。 |
String |
getPositiveSuffix() 获取正数后缀。 |
RoundingMode |
getRoundingMode() 获取在此 DecimalFormat 中使用的 RoundingMode 。 |
int |
hashCode() 重写 hashCode |
boolean |
isDecimalSeparatorAlwaysShown() 允许获取整数中小数分隔符的行为。 |
boolean |
isParseBigDecimal() 返回 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal 。 |
Number |
parse(String text, ParsePosition pos) 解析字符串中的文本,以生成一个 Number 。 |
void |
setCurrency(Currency currency) 设置格式化货币值时,此数字格式使用的货币。 |
void |
setDecimalFormatSymbols(DecimalFormatSymbols newSymbols) 设置小数格式符号,通常程序员或用户不改变此符号。 |
void |
setDecimalSeparatorAlwaysShown(boolean newValue) 允许设置整数中小数分隔符的行为。 |
void |
setGroupingSize(int newValue) 设置分组大小。 |
void |
setMaximumFractionDigits(int newValue) 设置某个数的小数部分中所允许的最大数字位数。 |
void |
setMaximumIntegerDigits(int newValue) 设置某个数字的整数部分中所允许的最大数字位数。 |
void |
setMinimumFractionDigits(int newValue) 设置某个数的小数部分中所允许的最小数字位数。 |
void |
setMinimumIntegerDigits(int newValue) 设置某个数字的整数部分中所允许的最小数字位数。 |
void |
setMultiplier(int newValue) 设置百分数、千分数和类似格式中使用的乘数。 |
void |
setNegativePrefix(String newValue) 设置负数前缀。 |
void |
setNegativeSuffix(String newValue) 设置负数后缀。 |
void |
setParseBigDecimal(boolean newValue) 设置 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal 。 |
void |
setPositivePrefix(String newValue) 设置正数前缀。 |
void |
setPositiveSuffix(String newValue) 设置正数后缀。 |
void |
setRoundingMode(RoundingMode roundingMode) 设置在此 DecimalFormat 中使用的 RoundingMode 。 |
String |
toLocalizedPattern() 合成一个表示此 Format 对象当前状态的、已本地化的模式字符串。 |
String |
toPattern() 合成一个表示此 Format 对象当前状态的模式字符串。 |
从类 java.text.Format 继承的方法 |
---|
format, parseObject |
从类 java.lang.Object 继承的方法 |
---|
finalize, getClass, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
public DecimalFormat()
要为给定的语言环境获取标准的格式,请对 NumberFormat 使用工厂方法,如 getNumberInstance。这些工厂方法将为给定的语言环境返回最适合的 NumberFormat 子类。
public DecimalFormat(String pattern)
要为给定的语言环境获取标准的格式,请对 NumberFormat 使用工厂方法,如 getNumberInstance。这些工厂方法将为给定的语言环境返回最适合的 NumberFormat 子类。
pattern
- 一个非本地化的模式字符串。
NullPointerException
- 如果
pattern
为 null
IllegalArgumentException
- 如果给定的 pattern 无效。
NumberFormat.getInstance()
,
NumberFormat.getNumberInstance()
,
NumberFormat.getCurrencyInstance()
,
NumberFormat.getPercentInstance()
public DecimalFormat(String pattern, DecimalFormatSymbols symbols)
要为给定的语言环境获取标准的格式,请对 NumberFormat 使用工厂方法,如 getInstance 或 getCurrencyInstance。如果只需为标准格式进行微小的调整,则可修改 NumberFormat 工厂方法所返回的格式。
pattern
- 一个非本地化的模式字符串。
symbols
- 要使用的符号集
NullPointerException
- 如果任意给定的参数为 null
IllegalArgumentException
- 如果给定的 pattern 无效
NumberFormat.getInstance()
,
NumberFormat.getNumberInstance()
,
NumberFormat.getCurrencyInstance()
,
NumberFormat.getPercentInstance()
,
DecimalFormatSymbols
方法详细信息 |
---|
public final StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos)
Number
的任意子类。
此实现使用所允许的最大精度。
NumberFormat
中的
format
number
- 要格式化的数
toAppendTo
- 将格式化的文本所要追加到的
StringBuffer
pos
- 在输入上:如果需要,是一个对齐字段。在输出上:对齐字段的偏移量。
toAppendTo
形式传入的值
IllegalArgumentException
- 如果
number
为 null 或不是
Number
的一个实例。
NullPointerException
- 如果
toAppendTo
或
pos
为 null
ArithmeticException
- 如果需要使用设置为 RoundingMode.UNNECESSARY 的舍入模式进行舍入
FieldPosition
public StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition)
NumberFormat
中的
format
number
- 要格式化的 double 值
result
- 将文本追加到的地方
fieldPosition
- 在输入上:如果需要,是一个对齐字段。在输出上:对齐字段的偏移量。
ArithmeticException
- 如果需要使用设置为 RoundingMode.UNNECESSARY 的舍入模式进行舍入
FieldPosition
public StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition)
NumberFormat
中的
format
number
- 要格式化的 long 值
result
- 将文本追加到的地方
fieldPosition
- 在输入上:如果需要,是一个对齐字段。在输出上:对齐字段的偏移量。
ArithmeticException
- 如果需要使用设置为 RoundingMode.UNNECESSARY 的舍入模式进行舍入
FieldPosition
public AttributedCharacterIterator formatToCharacterIterator(Object obj)
AttributedCharacterIterator
。可以使用返回的
AttributedCharacterIterator
来生成所得 String,并确定有关所得 String 的信息。
AttributedCharacterIterator 的每个属性键都是 NumberFormat.Field
类型的,属性值与属性键相同。
Format
中的
formatToCharacterIterator
obj
- 要格式化的对象
NullPointerException
- 如果 obj 为 null。
IllegalArgumentException
- Format 无法格式化给定的对象时。
ArithmeticException
- 如果需要使用设置为 RoundingMode.UNNECESSARY 的舍入模式进行舍入
public Number parse(String text, ParsePosition pos)
Number
。
该方法试图解析从 pos
所给定的索引处开始的文本。如果解析成功,则将 pos
的索引更新为所用最后一个字符后面的索引(不一定解析直到字符串末尾的所有字符),并返回解析后的数。可以使用更新后的 pos
指示下一次调用此方法的开始点。如果发生错误,则不更改 pos
的索引,并将 pos
的错误索引设置为发生错误处的字符索引,并且返回 null。
返回的子类取决于 isParseBigDecimal()
的值以及所解析的字符串。
isParseBigDecimal()
为 false(默认值),则以 Long
对象返回多数整数值,而不管其写入方式如何:"17"
和 "17.000"
都解析成 Long(17)
。不符合 Long
的值则以 Double
的形式返回。这包括有小数部分的值、无穷大的值、NaN
和值 -0.0。DecimalFormat
不 根据源字符串中是否有小数分隔符来决定返回 Double
还是 Long
值。这样做会无法准确地解析导致某个 double 尾数(如 "-9,223,372,036,854,775,808.00"
)溢出的整数。 调用者可能使用 Number
的方法 doubleValue
、longValue
等来获取所需类型的数值。
isParseBigDecimal()
为 true,则以 BigDecimal
对象的形式返回值。这些值是由 BigDecimal.BigDecimal(String)
以和语言环境无关的格式为相应字符串所构造的那些值。特殊的情况是正负无穷大和 NaN 值,它们以 Double
实例的形式返回,其中保存了相应的 Double
常量值。 DecimalFormat
解析所有由 Character.digit()
所定义的、表示小数数字的 Unicode 字符。另外,DecimalFormat
也将 DecimalFormatSymbols
对象中所定义的、从已本地化的阿拉伯数字 0 开始的 10 个连续字符识别为阿拉伯数字。
NumberFormat
中的
parse
text
- 要解析的字符串
pos
- 具有索引和上述错误索引信息的
ParsePosition
对象。
null
NullPointerException
- 如果
text
或
pos
为 null。
NumberFormat.isParseIntegerOnly()
,
Format.parseObject(java.lang.String, java.text.ParsePosition)
public DecimalFormatSymbols getDecimalFormatSymbols()
DecimalFormatSymbols
public void setDecimalFormatSymbols(DecimalFormatSymbols newSymbols)
newSymbols
- 所需的 DecimalFormatSymbols
DecimalFormatSymbols
public String getPositivePrefix()
示例:+123、$123、sFr123
public void setPositivePrefix(String newValue)
示例:+123、$123、sFr123
public