decimalformat
问题
今天在编程时,产品经理突然和我说,把所有的金额保留两位小数后,传递到前台。一时间,不知道该怎么做,于是,通过百度百科,查找到了decimalformat这个类,这就是格式化数据的类。但在使用这个类时,出现了错误,错误如下:
通过谷歌翻译得到:无法将给定对象格式化为数字
重点不是这句话,而是为什么无法将给定的对象格式化数字。
如果将String类型转化为bigdecimal类型的,就不会报错:
为什么会这样呢?
解释问题
通过查看源码得出,DecimalFormat继承了抽象类NumberFormat,NumberFormat继承了抽象类Format,里面各有format方法,我们来看看Format类中的format方法:
public abstract StringBuffer format(Object obj,
StringBuffer toAPPendTo,
fieldPosition pos);
这是个未实现的方法,我们点击idea左边的向下箭头,会出现让你惊讶的一幕:
实现该方法的类有很多,而我们今天所说的就DecimalFormat,我们来看看它的实现方法:
@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");
}
}
你会发现,我们居然找到了上面报错文字: throw new IllegalArgumentException(“Cannot format given Object as a Number“);
如果你知道instanceof 的话,你就会明白这是该对象是否是某类的实例化对象。这里的有很多包装类,就没有String类和自定义类型,因而,就会出现了错误。所以,它没办法解释格式化String类型的数据。
遇到报错别紧张,查看源码来解析,建议大家使用idea
文章最后发布于: 2018-08-23 14:39:46
相关阅读
Excel的自动求和功能非常实用,被广泛应用。有时我们会遇到Excel无法自动求和、或Excel自动求和数值不对怎么办?下面小编告诉你exce
一个网站成功建立以后,还有一个很大的愿景,那就想网站在成功建立并上线以后,能够拥有很好的排名,面对这样的问题时,网站如何优化排名?下
作为一个产品经理,肯定会遇到老板让你改进产品功能的问题,但是要改什么、怎么改都不明确。这时要怎么入手呢?有没有一些通用的套路呢
QQ等级达人图标是等级加速较快的QQ用户的尊贵标识。点亮QQ等级达人图标,标志着您正在加速升级QQ等级,向好友彰显您的等级加速成就
1、函数文件+调用命令文件:需单独定义一个自定义函数的M文件;2、函数文件+子函数:定义一个具有多个自定义函数的M文件;3、Inline:无