decimalformat精度丢失_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);

}

A DecimalFormat包括图案和一组符号 。 可以使用applyPattern()或间接使用API方法直接设置模式。 符号存储在一个DecimalFormatSymbols对象中。 当使用NumberFormat工厂方法时,模式和符号从本地化的ResourceBundle读取。

模式

DecimalFormat模式具有以下语法:

Pattern:

PositivePattern

PositivePattern ; NegativePattern

PositivePattern:

Prefixopt Number Suffixopt

NegativePattern:

Prefixopt Number Suffixopt

Prefix:

any Unicode characters except \uFFFE, \uFFFF, and special characters

Suffix:

any Unicode characters except \uFFFE, \uFFFF, and special characters

Number:

Integer Exponentopt

Integer . Fraction Exponentopt

Integer:

MinimumInteger

#

# Integer

# , Integer

MinimumInteger:

0

0 MinimumInteger

0 , MinimumInteger

Fraction:

MinimumFractionopt OptionalFractionopt

MinimumFraction:

0 MinimumFractionopt

OptionalFraction:

# OptionalFractionopt

Exponent:

E MinimumExponent

MinimumExponent:

0 MinimumExponentopt

A DecimalFormat模式包含正和负子模式,例如"#,##0.00;(#,##0.00)" 。 每个子模式都有一个前缀,数字部分和后缀。 负子模式是可选的; 如果不存在,则使用以局部减号( '-'在大多数语言环境中)前缀的正子模式作为负子模式。 也就是说, "0.00"独自相当于"0.00;-0.00" 。 如果存在显式的负子模式,则仅用于指定负前缀和后缀; 位数,最小数字和其他特征与正图案完全相同。 这意味着"#,##0.0#;(#)"产生与"#,##0.0#;(#,##0.0#)"完全相同的行为。

用于无穷大,数字,数千个分隔符,十进制分隔符等的前缀,后缀和各种符号可以设置为任意值,并且在格式化期间它们将正确显示。 但是,必须注意符号和字符串不冲突,否则解析将不可靠。 例如,对于DecimalFormat.parse() ,正负号前缀或后缀必须是不同的,以便能够区分正值和负值。 (如果它们相同,那么DecimalFormat将表现为没有指定负子模式。)另一个例子是,小数分隔符和千位分隔符应该是不同的字符,否则解析将是不可能的。

分组分隔符通常用于数千个,但在一些国家,它分隔成万。 分组大小是分组字符之间的常数数字,例如3个为100,000,000或4为1,0000,0000。 如果您提供具有多个分组字符的模式,则最后一个和整数结束之间的间隔是使用的模式。 所以"#,##,###,####" == "######,####" == "##,####,####" 。

特殊图案字符

一个模式中的许多人物都是字面上的; 在格式化期间,它们在解析期间匹配,输出不变。 另一方面,特殊字符代表其他字符,字符串或字符类。 除非另有说明,否则必须引用它们,如果它们以字面值的形式出现在前缀或后缀中。

这里列出的字符用于非本地化模式。 本地化模式使用从该格式化程序的DecimalFormatSymbols对象中取得的相应字符,而这些字符将失去其特殊状态。 货币符号和报价两个例外都不是本地化的。

Chart showing symbol, location, localized, and meaning.

Symbol

Location

Localized?

Meaning

0

Number

Yes

Digit

#

Number

Yes

Digit, zero shows as absent

.

Number

Yes

Decimal separator or monetary decimal separator

-

Number

Yes

Minus sign

,

Number

Yes

Grouping separator

E

Number

Yes

Separates mantissa and exponent in scientific notation. Need not be quoted in prefix or suffix.

;

Subpattern boundary

Yes

Separates positive and negative subpatterns

%

Prefix or suffix

Yes

Multiply by 100 and show as percentage

\u2030

Prefix or suffix

Yes

Multiply by 1000 and show as per mille value

¤ (\u00A4)

Prefix or suffix

No

Currency sign, replaced by currency symbol. If doubled, replaced by international currency symbol. If present in a pattern, the monetary decimal separator is used instead of the decimal separator.

'

Prefix or suffix

No

Used to quote special characters in a prefix or suffix, for example, "'#'#" formats 123 to "#123". To create a single quote itself, use two in a row: "# o''clock".

科学计数法

科学符号中的数字表示为尾数和幂的乘积,例如,1234可以表示为1.234×10 ^ 3。 尾数通常在1.0‰x <10.0的范围内,但不一定是。 可以指示DecimalFormat格式化和分析科学符号, 只能通过模式 ; 目前没有工厂方法创建科学的符号格式。 在一个模式中,紧随着一个或多个数字字符的指数字符表示科学符号。 示例: "0.###E0"将号码1234格式化为"1.234E3" 。

指数字符后的数字字符数给出最小指数数字计数。 没有最大值。 负指数使用局部减号进行格式化, 而不是模式的前缀和后缀。 这允许模式如"0.###E0 m/s" 。

整数数字的最小和最大数字一起解释:

如果整数数字的最大数目大于其最小数目并大于1,则强制指数为整数数字的最大数目的倍数,而将最小数字解释为1。最常见的使用这个是生成工程符号 ,其中指数是三的倍数,例如"##0.#####E0" 。 使用此模式,数字12345格式为"12.345E3" ,而123456格式为"123.456E3" 。

否则,通过调整指数来实现最小数字的整数。 示例:0.00123格式化为"00.###E0"产生"12.3E-4" 。

尾数中的有效位数是最小整数和最大小数位数之和,不受最大整数数字的影响。 例如,使用"##0.##E0"格式化的12345是"12.3E3" 。 要显示所有数字,将有效数字计数设置为零。 有效数字的数量不会影响解析。

指数图案可能不包含分组分隔符。

四舍五入

DecimalFormat提供RoundingMode中格式化定义的舍入模式。

数字

对于格式化, DecimalFormat使用从DecimalFormatSymbols对象中定义的本地化零位开始的十个连续字符作为数字。

对于解析,这些数字以及由Character.digit定义的所有Unicode十进制数字都被识别。

特殊价值观

NaN格式化为字符串,通常具有单个字符\uFFFD 。 该字符串由DecimalFormatSymbols对象确定。 这是唯一未使用前缀和后缀的值。

Infinity格式化为字符串,通常具有单个字符\u221E ,其中应用了正或负的前缀和后缀。 无穷大字符串由DecimalFormatSymbols对象确定。

负零( "-0" )解析

BigDecimal(0)如果isParseBigDecimal()是真的,

Long(0)如果isParseBigDecimal()是假的,并isParseIntegerOnly()是真的,

Double(-0.0)如果两个isParseBigDecimal()和isParseIntegerOnly()都是假的。

十进制格式通常不同步。 建议为每个线程创建单独的格式实例。 如果多个线程同时访问格式,则必须在外部进行同步。

// 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) {}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值