但是我没有错。这是我的代码
DecimalFormat twoDForm = new DecimalFormat("#.##");
double externalmark = 1.86;
double internalmark = 4.0;
System.out.println(String.valueOf((externalmark*3+internalmark*1)/4));
String val = String.valueOf((externalmark*3+internalmark*1)/4);
String wgpa1=twoDForm.format(val); // gives exception
String wgpa2=twoDForm.format((externalmark*3+internalmark*1)/4)); // works fine
System.out.println(wgpa1);
该format
方法采用Object类型参数,因此这就是为什么我传递了一个给出异常的String对象的原因
线程“主”中的异常java.lang.IllegalArgumentException:无法 将给定对象格式化为数字。
但是,当我给出double值作为参数时,程序运行良好。但是,如果使用Object
类型实参定义该方法,为什么在传递a
String
时却得到异常而在传递时却没有得到异常double
?
的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, FieldPosition pos)
一个期望的方法number
的论点,即是实例Number
类(Short
,Long
,… Double
):
@Override
public 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
。
这可能看起来像是一个重复的问题,但我在下面的所有链接中都尝试了,不能得到一个适当的答案。 无法将给定对象格式化为数字组合框
问题内容: 我正在尝试使用DecimalFormat格式化价格,但这不适用于所有版本。 版画 和 但是“ 7.79999”的格式设置为“ 7.8”,而不是“ 7.80”。我尝试过这种方式 强制两个dp,但是“ 85.0”的格式设置为“ 85.00”而不是“ 85”! 有没有一种方法可以捕获所有变化,以便将价格打印为#,##或#。##?例如: 5、55、5.55、5.50、500、500.40 问题
问题内容: 我用这种格式记录日期 我需要将其转换为 我尝试过这种方式 但是我在运行时遇到这个异常 谁能帮我解决这个问题。 问题答案: 试试这个 另外,请注意这是几分钟,而几个月是。
我有这个格式的日期(2012-11-17T00:00:00.000-05:00)。我需要将日期转换成这种格式MM/YYYY。 我试过这个方法,但我得到了这个例外。 请看下面我的代码:
我有一个yyyyMMdd格式的字符串,我想要DD.MM.YYYY 我的代码出现了这个错误 java.lang.IllegalArgumentException:无法将给定对象格式化为日期 有人帮忙吗?