深入理解DecimalFormat.format()方法
阿新 • • 發佈:2019-01-23
問題
今天在程式設計時,產品經理突然和我說,把所有的金額保留兩位小數後,傳遞到前臺。一時間,不知道該怎麼做,於是,通過百度百科,查詢到了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