天天看點

DecimalFormat的使用

原來沒有接觸過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的使用肯定是沒有問題的。最主要的就是我們要多考慮幾種情況。上面如果有不對的地方請大家留言,讓我們繼續前進。

繼續閱讀