前言
原來(lái)沒有接觸過(guò)DecimalFormat姜贡,沒有想到還有這玩意棺棵。使用的時(shí)候還是不錯(cuò)的烛恤,詳細(xì)的了解可以看官方的api。找到了中文的api,小伙子們可以直接跳轉(zhuǎn)捌谎币喧!
DecimalFormat 是 NumberFormat 的一個(gè)具體子類杀餐,用于格式化十進(jìn)制數(shù)字干发。
DecimalFormat 包含一個(gè)模式 和一組符號(hào)史翘。差點(diǎn)忘記說(shuō)它是干嘛的冀续。
符號(hào)含義:
上一個(gè)經(jīng)典的表格搀暑,我們來(lái)說(shuō)一說(shuō)響應(yīng)的符號(hào)的意義:
符號(hào) | 位置 | 本地化? | 含義 |
---|---|---|---|
0 | 數(shù)字 | 是 | 阿拉伯?dāng)?shù)字 |
# | 數(shù)字 | 是 | 阿拉伯?dāng)?shù)字如果不存在就顯示為空 |
. | 數(shù)字 | 是 | 小數(shù)分隔符或貨幣小數(shù)分隔符 |
- | 數(shù)字 | 是 | 減號(hào) |
, | 數(shù)字 | 是 | 分組分隔符 |
E | 數(shù)字 | 是 | 分割科學(xué)技術(shù)法中的尾數(shù)和指數(shù)桐罕。在前綴和后綴中無(wú)需添加引號(hào) |
; | 子模式邊界 | 是 | 分隔正數(shù)和負(fù)數(shù)子模式 |
% | 前綴或后綴 | 是 | 乘以100并顯示為百分?jǐn)?shù) |
/u2030 | 前綴或后綴 | 是 | 乘以1000并顯示為千分?jǐn)?shù) |
¤ (\u00A4) | 前綴或后綴 | 否 | 貨幣記號(hào)桂敛,由貨幣符號(hào)替換术唬。如果兩個(gè)同時(shí)出現(xiàn),則用國(guó)際貨幣符號(hào)替換嫁怀。如果出現(xiàn)在某個(gè)模式中塘淑,則使用貨幣小數(shù)分隔符蚂斤,而不使用小數(shù)分隔符 |
' | 前綴或后綴 | 否 | 用于在前綴或或后綴中為特殊字符加引號(hào)曙蒸,例如 "'#'#" 將 123 格式化為 "#123"。要?jiǎng)?chuàng)建單引號(hào)本身肖油,請(qǐng)連續(xù)使用兩個(gè)單引號(hào):"# o''clock" |
分析問題和實(shí)戰(zhàn)
當(dāng)真的要寫實(shí)戰(zhàn)分析的時(shí)候發(fā)現(xiàn)真的不知道怎么寫了臂港,尷尬了扒魉摇凶朗!
先來(lái)說(shuō)一下最常用的寫法棚愤。
1.最基本的使用
1.1 0和#配合使用
網(wǎng)上的例子還是比較多的杂数,我也感覺很有代表性揍移,我也借鑒一下反肋。下面直接上代碼:
double pi = 3.1415927;//圓周率
//取一位整數(shù)
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整數(shù)和兩位小數(shù)
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取兩位整數(shù)和三位小數(shù)石蔗,整數(shù)不足部分以0填補(bǔ)。
System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//取所有整數(shù)部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式計(jì)數(shù)诉探,并取兩位小數(shù)
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
/**
* 上面的代碼就是網(wǎng)上很經(jīng)典的案例肾胯,下面我們來(lái)分析另外的一個(gè)值
*/
pi=12.34567;
//取一位整數(shù)
System.out.println(new DecimalFormat("0").format(pi));//12
//取一位整數(shù)和兩位小數(shù)
System.out.println(new DecimalFormat("0.00").format(pi));//12.35
//取兩位整數(shù)和三位小數(shù)耘纱,整數(shù)不足部分以0填補(bǔ)揣炕。
System.out.println(new DecimalFormat("00.000").format(pi));// 12.346
//取所有整數(shù)部分
System.out.println(new DecimalFormat("#").format(pi));//12
//以百分比方式計(jì)數(shù),并取兩位小數(shù)
System.out.println(new DecimalFormat("#.##%").format(pi));//1234.57%
/**
* 擴(kuò)展鹰溜,如果是其他的數(shù)字會(huì)是下面的效果
*/
pi=12.34;
//整數(shù)
System.out.println(new DecimalFormat("6").format(pi));//612
System.out.println(new DecimalFormat("60").format(pi));//612
System.out.println(new DecimalFormat("06").format(pi));//126
System.out.println(new DecimalFormat("00600").format(pi));//00126
System.out.println(new DecimalFormat("#####60000").format(pi));//00126
//小數(shù)
System.out.println(new DecimalFormat(".6").format(pi));//12.6
System.out.println(new DecimalFormat(".06").format(pi));//12.36
System.out.println(new DecimalFormat(".60").format(pi));//12.36
System.out.println(new DecimalFormat(".0600").format(pi));//12.3406
System.out.println(new DecimalFormat(".6000").format(pi));//12.3406
System.out.println(new DecimalFormat(".600000##").format(pi));//12.340006
上面的例子基本滿足我們想要的格式化的一些東西了曹动。我們來(lái)對(duì)比分析一下上面兩個(gè)值墓陈,很明顯.
就是我們常用的小數(shù)點(diǎn)分隔符第献,前面是整數(shù)庸毫,后面是小數(shù)。
1.整數(shù):若是n個(gè)0利花,就從個(gè)位開始向高位填充,如果有值就是原來(lái)的值臀栈,沒有就填充0权薯。
??????? 若都是#欲侮,沒有實(shí)際意義威蕉,不管是幾個(gè)#,最后的結(jié)果都是原來(lái)的整數(shù)牍戚。
??????? 0和#配合使用虑粥,只能是"##00",不能是"00##",就是#在前0在后
娩贷。實(shí)現(xiàn)是上面的合集彬祖。
2.小數(shù):是可以保留小數(shù)點(diǎn)后幾位的(幾個(gè)0后或幾個(gè)#)。
??????? 若n個(gè)0甜熔,就是保留n位小數(shù)突倍,小數(shù)不足的部分用0填充羽历。
??????? 若n個(gè)#,就是保留n位小數(shù)诵闭,小數(shù)不足部分沒有就是沒有涂圆。
??????? 0和#配合使用币叹,只能是".00##",不能是".##00",就是0在前#在后
颈抚。實(shí)現(xiàn)和上面一樣。
3.數(shù)字(1-9):上面的分析不是#就是0驱富,如果是其他的數(shù)值會(huì)怎樣呢褐鸥?
上面的擴(kuò)展很詳細(xì)的說(shuō)明這個(gè)問題赐稽。
??????? 整數(shù):若沒有0或#姊舵,默認(rèn)在后面拼接整數(shù)括丁;若有0或#,找到第一個(gè)0或#的位置尖昏,然后找出所有的0或#拼在一起祸憋,按照上面的規(guī)則,在第一個(gè)0或#出現(xiàn)的位置插入響應(yīng)的格式化以后的值掸鹅。
??????? 小數(shù):若沒有0或#巍沙,格式化是什么就顯示什么荷鼠;若有0或#,找出所有的0或#拼在一起矮嫉,按照上面的規(guī)則蠢笋,在小數(shù)點(diǎn)的后面插入響應(yīng)的格式化以后的值。
有了上面的總結(jié)瞻惋,想生成什么就是什么歼狼,就是這么人性享怀!
2.科學(xué)計(jì)數(shù)法 E
在使用double的時(shí)候如果后面的小數(shù)為過(guò)多就會(huì)自動(dòng)轉(zhuǎn)換為科學(xué)計(jì)數(shù)法凹蜈,你聽聽這名字多么高級(jí)仰坦,科學(xué)計(jì)數(shù)法。(這一塊寫的我心力憔悴??)
來(lái)吧我們直接上代碼然后分析:
pi = 123456789.3456;
System.out.println(new DecimalFormat("0E0").format(pi));//1E8
System.out.println(new DecimalFormat("0E00").format(pi));//1E08
System.out.println(new DecimalFormat("#E0").format(pi));//.1E9
System.out.println(new DecimalFormat("##E0").format(pi));//1.2E8
System.out.println(new DecimalFormat("###E0").format(pi));//123E6
System.out.println(new DecimalFormat("####E0").format(pi));//1.235E8
System.out.println(new DecimalFormat("#####E0").format(pi));//1234.6E5
System.out.println(new DecimalFormat("######E0").format(pi));//123.457E6
System.out.println(new DecimalFormat("#######E0").format(pi));//12.34568E7
System.out.println(new DecimalFormat("########E0").format(pi));//1.2345679E8
System.out.println(new DecimalFormat("#########E0").format(pi));//123456789E0
System.out.println(new DecimalFormat("##########E0").format(pi));//123456789.3E0
pi = 12345678.3456;
System.out.println(new DecimalFormat("0E0").format(pi));//1E7
System.out.println(new DecimalFormat("0E00").format(pi));//1E07
System.out.println(new DecimalFormat("#E0").format(pi));//.1E8
System.out.println(new DecimalFormat("##E0").format(pi));//12E6
System.out.println(new DecimalFormat("###E0").format(pi));//12.3E6
System.out.println(new DecimalFormat("####E0").format(pi));//1235E4
System.out.println(new DecimalFormat("#####E0").format(pi));//123.46E5
System.out.println(new DecimalFormat("######E0").format(pi));//12.3457E6
System.out.println(new DecimalFormat("#######E0").format(pi));//12.34568E7
System.out.println(new DecimalFormat("########E0").format(pi));//12345678E0
System.out.println(new DecimalFormat("#########E0").format(pi));//12345678.3E0
System.out.println(new DecimalFormat("##########E0").format(pi));//12345678.35E0
/**
* 0的個(gè)數(shù)決定最后輸出結(jié)果的位數(shù)
* 并且與0的位置無(wú)關(guān)
*/
pi = 12345;
System.out.println(new DecimalFormat("###.##E0").format(pi));//12.345E3
System.out.println(new DecimalFormat("##0.##E0").format(pi));//12.345E3
System.out.println(new DecimalFormat("##0.0##E0").format(pi));//12.345E3
System.out.println(new DecimalFormat("##0.00000##E0").format(pi));//12.3450E3
System.out.println(new DecimalFormat("#00.0000##E0").format(pi));//12.3450E3
System.out.println(new DecimalFormat("#00.00000##E0").format(pi));//12.34500E3
上面的例子我感覺還是比較全的悄晃,看看例子分析一下玫霎,就能明白了。
總結(jié):
1.使用科學(xué)計(jì)數(shù)法妈橄,首先保證E
前面有0或者#庶近,否則就不是科學(xué)計(jì)數(shù)法。
2.E
后面必須是0眷蚓,0的個(gè)數(shù)對(duì)后面的顯示是有影響的鼻种,多余就會(huì)填充0.
3.E
前面只有一個(gè)#,得到的結(jié)果肯定是.
開頭的結(jié)果沙热。
4.E
前面#與0的總個(gè)數(shù)決定后面的指數(shù),具體:總個(gè)數(shù)和指數(shù)比較篙贸,如果指數(shù)的值大于總個(gè)數(shù)投队,那么得到的指數(shù)的值是個(gè)數(shù)的倍數(shù);如果指數(shù)的值小于等于總個(gè)數(shù)爵川,那么得到的指數(shù)的值等于總個(gè)數(shù)敷鸦;
5.整個(gè)模式中的0的總個(gè)數(shù)決定最后輸出結(jié)果的位數(shù),并且與0的位置無(wú)關(guān)。
6.如果整數(shù)部分需要保留幾位數(shù)扒披,就使用幾個(gè)0值依。
3.分組分隔符和減號(hào)
3.1分組分隔符 ,
這不就是逗號(hào)么?不這是分隔符碟案,哈哈??鳞滨!
直接上代碼:
pi = 1299792458;
//每三位以逗號(hào)進(jìn)行分隔。
System.out.println(new DecimalFormat(",###").format(pi));//1,299,792,458
System.out.println(new DecimalFormat(",##").format(pi));//12,99,79,24,58
System.out.println(new DecimalFormat("###,##").format(pi));//12,99,79,24,58
上面的代碼蟆淀,最常用的就是千位分隔符。
不管模式中有多少個(gè)分隔符澡匪,最右邊的那一個(gè)有效熔任;每一組的個(gè)數(shù)就是最右邊的分隔符之右的整數(shù)位數(shù)。
3.2 減號(hào) -
-
表示輸出為負(fù)數(shù)唁情, 要放在最前面疑苔。代碼如下:
pi = 3.14;
System.out.println(new DecimalFormat("-0.00").format(pi));//-3.14
4. 關(guān)于前綴、后綴
4.1 % 將數(shù)字乘以100
pi = 0.1234;
System.out.println(new DecimalFormat("0.00%").format(pi));//12.34%
System.out.println(new DecimalFormat("0%.00").format(pi));//12.34%
System.out.println(new DecimalFormat("%0.00").format(pi));//%12.34
%處理最前面不能放置之外甸鸟,其他的地方都可以放置惦费。
4.2 \u2030 將數(shù)字乘以1000
pi = 0.1234;
System.out.println(new DecimalFormat("0.00\u2030").format(pi));//123.40‰
System.out.println(new DecimalFormat("0.0\u20300").format(pi));//123.40‰
System.out.println(new DecimalFormat("\u20300.00").format(pi));//‰123.40
\u2030
和%
用法是一樣的。
4.3 ¤(\u00A4) 本地化貨幣符號(hào)
如果連續(xù)出現(xiàn)兩次抢韭,代表貨幣符號(hào)的國(guó)際代號(hào)薪贫。
pi = 1234.5678;
System.out.println(new DecimalFormat(",000.00¤").format(pi));//1,234.57¥
System.out.println(new DecimalFormat(",000.¤00").format(pi));//1,234.57¥
System.out.println(new DecimalFormat("¤,000.00").format(pi));//¥1,234.57
System.out.println(new DecimalFormat(",00¤0.¤00").format(pi));//1,234.57¥¥
System.out.println(new DecimalFormat("¤,000.¤00").format(pi));//¥1,234.57¥
System.out.println(new DecimalFormat(",000.00¤¤").format(pi));//1,234.57CNY
4.4 ' 用于引用特殊的字符,作為前綴或后綴刻恭。
pi = 4.5678;
System.out.println(new DecimalFormat("'#'0.00").format(pi));//#4.57
System.out.println(new DecimalFormat("'^?_?^'0.00").format(pi));//^?_?^4.57
//使用'本身作為前綴或后綴
System.out.println(new DecimalFormat("''0.00").format(pi));//'4.57
5. 四舍五入
說(shuō)的就是我們數(shù)學(xué)上常說(shuō)的四舍五入的問題瞧省。
DecimalFormat
提供 RoundingMode
中定義的舍入模式進(jìn)行格式化。默認(rèn)情況下鳍贾,它使用 RoundingMode.HALF_EVEN
鞍匾。
6. 同步
DecimalFormat 通常不是同步的。建議為每個(gè)線程創(chuàng)建獨(dú)立的格式實(shí)例骑科。如果多個(gè)線程同時(shí)訪問某個(gè)格式橡淑,則必須保持外部同步。
7. 特殊值
NaN 被格式化為一個(gè)字符串咆爽,通常具有單個(gè)字符 \uFFFD梁棠。此字符串由 DecimalFormatSymbols 對(duì)象所確定。這是唯一不使用前綴和后綴的值伍掀。
無(wú)窮大的值被格式化為一個(gè)字符串掰茶,通常具有單個(gè)字符 \u221E,具有正數(shù)或負(fù)數(shù)前綴和后綴蜜笤。無(wú)窮大值的字符串由 DecimalFormatSymbols 對(duì)象所確定濒蒋。
將負(fù)零("-0")解析為
- 如果 isParseBigDecimal() 為 true,則為 BigDecimal(0),
- 如果 isParseBigDecimal() 為 false 并且 isParseIntegerOnly() 為 true沪伙,則為 Long(0)瓮顽,
- 如果 isParseBigDecimal() 和 isParseIntegerOnly() 均為 false,則為 Double(-0.0)围橡。
總結(jié)
看完我們上面的文章暖混,對(duì)于DecimalFormat的使用肯定是沒有問題的。最主要的就是我們要多考慮幾種情況翁授。上面如果有不對(duì)的地方請(qǐng)大家留言拣播,讓我們繼續(xù)前進(jìn)。