1. 程式人生 > >深入理解DecimalFormat.format()方法

深入理解DecimalFormat.format()方法

問題

今天在程式設計時,產品經理突然和我說,把所有的金額保留兩位小數後,傳遞到前臺。一時間,不知道該怎麼做,於是,通過百度百科,查詢到了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