欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深入理解DecimalFormat.format()方法

程序员文章站 2022-07-15 12:42:33
...

问题

今天在编程时,产品经理突然和我说,把所有的金额保留两位小数后,传递到前台。一时间,不知道该怎么做,于是,通过百度百科,查找到了DecimalFormat这个类,这就是格式化数据的类。但在使用这个类时,出现了错误,错误如下:
深入理解DecimalFormat.format()方法
通过谷歌翻译得到:无法将给定对象格式化为数字
重点不是这句话,而是为什么无法将给定的对象格式化数字。
深入理解DecimalFormat.format()方法
如果将String类型转化为BigDecimal类型的,就不会报错:
深入理解DecimalFormat.format()方法
为什么会这样呢?

解释问题

通过查看源码得出,DecimalFormat继承了抽象类NumberFormat,NumberFormat继承了抽象类Format,里面各有format方法,我们来看看Format类中的format方法:

public abstract StringBuffer format(Object obj,
                    StringBuffer toAppendTo,
                    FieldPosition pos);

这是个未实现的方法,我们点击idea左边的向下箭头,会出现让你惊讶的一幕:
深入理解DecimalFormat.format()方法
实现该方法的类有很多,而我们今天所说的就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