原來沒有接觸過DecimalFormat,沒有想到還有這玩意。使用的時候還是不錯的,詳細的了解可以看官方的api。找到了中文的api,小夥子們可以直接跳轉啊!
DecimalFormat 是 NumberFormat 的一個具體子類,用于格式化十進制數字。
DecimalFormat 包含一個模式 和一組符号。差點忘記說它是幹嘛的。
上一個經典的表格,我們來說一說響應的符号的意義:
符号
位置
本地化?
含義
數字
是
阿拉伯數字
#
阿拉伯數字如果不存在就顯示為空
.
小數分隔符或貨币小數分隔符
-
減号
,
分組分隔符
E
分割科學技術法中的尾數和指數。在字首和字尾中無需添加引号
;
子模式邊界
分隔正數和負數子模式
%
字首或字尾
乘以100并顯示為百分數
/u2030
乘以1000并顯示為千分數
¤ (\u00A4)
否
貨币記号,由貨币符号替換。如果兩個同時出現,則用國際貨币符号替換。如果出現在某個模式中,則使用貨币小數分隔符,而不使用小數分隔符
'
用于在字首或或字尾中為特殊字元加引号,例如 "'#'#" 将 123 格式化為 "#123"。要建立單引号本身,請連續使用兩個單引号:"# o''clock"
當真的要寫實戰分析的時候發現真的不知道怎麼寫了,尴尬了啊!
先來說一下最常用的寫法。
1.1 0和#配合使用
網上的例子還是比較多的,我也感覺很有代表性,我也借鑒一下。下面直接上代碼:
上面的例子基本滿足我們想要的格式化的一些東西了。我們來對比分析一下上面兩個值,很明顯<code>.</code>就是我們常用的小數點分隔符,前面是整數,後面是小數。
1.整數:若是n個0,就從個位開始向高位填充,如果有值就是原來的值,沒有就填充0。 若都是#,沒有實際意義,不管是幾個#,最後的結果都是原來的整數。 0和#配合使用,<code>隻能是"##00",不能是"00##",就是#在前0在後</code>。實作是上面的合集。 2.小數:是可以保留小數點後幾位的(幾個0後或幾個#)。 若n個0,就是保留n位小數,小數不足的部分用0填充。 若n個#,就是保留n位小數,小數不足部分沒有就是沒有。 0和#配合使用,<code>隻能是".00##",不能是".##00",就是0在前#在後</code>。實作和上面一樣。 3.數字(1-9):上面的分析不是#就是0,如果是其他的數值會怎樣呢? 上面的擴充很詳細的說明這個問題。 整數:若沒有0或#,預設在後面拼接整數;若有0或#,找到第一個0或#的位置,然後找出所有的0或#拼在一起,按照上面的規則,在第一個0或#出現的位置插入響應的格式化以後的值。 小數:若沒有0或#,格式化是什麼就顯示什麼;若有0或#,找出所有的0或#拼在一起,按照上面的規則,在小數點的後面插入響應的格式化以後的值。
有了上面的總結,想生成什麼就是什麼,就是這麼人性!
在使用double的時候如果後面的小數為過多就會自動轉換為科學計數法,你聽聽這名字多麼進階,科學計數法。(這一塊寫的我心力憔悴?)
來吧我們直接上代碼然後分析:
上面的例子我感覺還是比較全的,看看例子分析一下,就能明白了。
總結: 1.使用科學計數法,首先保證<code>E</code>前面有0或者#,否則就不是科學計數法。 2.<code>E</code>後面必須是0,0的個數對後面的顯示是有影響的,多餘就會填充0. 3.<code>E</code>前面隻有一個#,得到的結果肯定是<code>.</code>開頭的結果。 4.<code>E</code>前面#與0的總個數決定後面的指數,具體:總個數和指數比較,如果指數的值大于總個數,那麼得到的指數的值是個數的倍數;如果指數的值小于等于總個數,那麼得到的指數的值等于總個數; 5.整個模式中的0的總個數決定最後輸出結果的位數,并且與0的位置無關。 6.如果整數部分需要保留幾位數,就使用幾個0。
3.1分組分隔符 ,
這不就是逗号麼?不這是分隔符,哈哈?!
直接上代碼:
上面的代碼,最常用的就是千位分隔符。
不管模式中有多少個分隔符,最右邊的那一個有效;每一組的個數就是最右邊的分隔符之右的整數位數。
3.2 減号 -
<code>-</code>表示輸出為負數, 要放在最前面。代碼如下:
4.1 % 将數字乘以100
%處理最前面不能放置之外,其他的地方都可以放置。
4.2 \u2030 将數字乘以1000
<code>\u2030</code>和<code>%</code>用法是一樣的。
4.3 ¤(\u00A4) 本地化貨币符号
如果連續出現兩次,代表貨币符号的國際代号。
4.4 ' 用于引用特殊的字元,作為字首或字尾。
說的就是我們數學上常說的四舍五入的問題。
<code>DecimalFormat</code> 提供 <code>RoundingMode</code> 中定義的舍入模式進行格式化。預設情況下,它使用 <code>RoundingMode.HALF_EVEN</code>。
DecimalFormat 通常不是同步的。建議為每個線程建立獨立的格式執行個體。如果多個線程同時通路某個格式,則必須保持外部同步。
NaN 被格式化為一個字元串,通常具有單個字元 \uFFFD。此字元串由 DecimalFormatSymbols 對象所确定。這是唯一不使用字首和字尾的值。
無窮大的值被格式化為一個字元串,通常具有單個字元 \u221E,具有正數或負數字首和字尾。無窮大值的字元串由 DecimalFormatSymbols 對象所确定。
将負零("-0")解析為
如果 isParseBigDecimal() 為 true,則為 BigDecimal(0),
如果 isParseBigDecimal() 為 false 并且 isParseIntegerOnly() 為 true,則為 Long(0),
如果 isParseBigDecimal() 和 isParseIntegerOnly() 均為 false,則為 Double(-0.0)。
看完我們上面的文章,對于DecimalFormat的使用肯定是沒有問題的。最主要的就是我們要多考慮幾種情況。上面如果有不對的地方請大家留言,讓我們繼續前進。