使用DecimalFormat进行格式化会引发异常-“无法将给定对象格式化为数字”

使用DecimalFormat进行格式化会引发异常-“无法将给定对象格式化为数字”,第1张

使用DecimalFormat进行格式化会引发异常-“无法将给定对象格式化为数字”

format()
方法
DecimalFormat
超载。

在工作情况下,您正在调用

 public final String format(double number)

在失败的情况下,您正在调用:

 public final String format (Object obj)

第一种方法有一个非常具体的参数。它期望一个

double

与第二种情况不同,接受的类型非常广泛:

Object
在这种情况下,对传递的类型的检查在运行时执行。

通过提供一个不是a

double
而是a 的参数,
String
调用的方法是第二个方法。

引擎盖下,此方法依赖于

format(Object number, StringBuffer toAppendTo, FieldPositionpos)
一个期望的方法
number
的论点,即是实例
Number
类(
Short
Long
,…
Double
):

@Overridepublic final StringBuffer format(Object number,StringBuffer toAppendTo,FieldPosition pos) {    if (number instanceof Long ||         number instanceof Integer ||     number instanceof Short ||         number instanceof Byte ||     number instanceof AtomicInteger ||        number instanceof AtomicLong ||        (number instanceof BigInteger && ((BigInteger)number).bitLength () < 64)) {        return format(((Number)number).longValue(), toAppendTo, pos);    } else if (number instanceof BigDecimal) {        return format((BigDecimal)number, toAppendTo, pos);    } else if (number instanceof BigInteger) {        return format((BigInteger)number, toAppendTo, pos);    } else if (number instanceof Number) {        return format(((Number)number).doublevalue(), toAppendTo, pos);    } else {        throw new IllegalArgumentException("Cannot format given Object as a Number");    }}

但事实并非如此,因为您将

String
实例传递给它。

要解决该问题,可以

double
像成功案例中那样传递原语,也可以将您
String
转换为
Number
诸如
Double
with
的实例
Double.valueOf(yourString)

我建议采用第一种方式(通过
double
),因为它在已经使用
double
原语的代码中更加自然。
第二个需要从
String
到的附加转换 *** 作
Double




欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5427054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存