DecimalFormat 包含一個模式 和一組符號
符號含義:
符號 | 位置 | 本地化? | 含義 |
0 |
數(shù)字 | 是 | 阿拉伯?dāng)?shù)字 |
# |
數(shù)字字 | 是 | 阿拉伯?dāng)?shù)字,如果不存在則顯示為空 |
. |
數(shù)字 | 是 | 小數(shù)分隔符或貨幣小數(shù)分隔符 |
- |
數(shù)字 | 是 | 減號 |
, |
數(shù)字 | 是 | 分組分隔符 |
E |
數(shù)字 | 是 | 分隔科學(xué)計數(shù)法中的尾數(shù)和指數(shù)。在前綴或后綴中無需加引號。 |
; |
子模式邊界 | 是 | 分隔正數(shù)和負(fù)數(shù)子模式 |
% |
前綴或后綴 | 是 | 乘以 100 并顯示為百分?jǐn)?shù) |
/u2030 |
前綴或后綴 | 是 | 乘以 1000 并顯示為千分?jǐn)?shù) |
¤ (/u00A4 ) |
前綴或后綴 | 否 | 貨幣記號,由貨幣符號替換。如果兩個同時出現(xiàn),則用國際貨幣符號替換。如果出現(xiàn)在某個模式中,則使用貨幣小數(shù)分隔符,而不使用小數(shù)分隔符。 |
' |
前綴或后綴 | 否 |
用于在前綴或或后綴中為特殊字符加引號,例如 "'#'#" 將 123 格式化為 "#123" 。要創(chuàng)建單引號本身,請連續(xù)使用兩個單引號:"# o''clock" 。 |
例子:
DecimalFormat df1 = new DecimalFormat("0.0");
DecimalFormat df2 = new DecimalFormat("#.#");
DecimalFormat df3 = new DecimalFormat("000.000");
DecimalFormat df4 = new DecimalFormat("###.###");
System.out.println(df1.format(12.34));
System.out.println(df2.format(12.34));
System.out.println(df3.format(12.34));
System.out.println(df4.format(12.34));
運(yùn)行結(jié)果:
12.3
12.3
012.340
12.34
DecimalFormat format = new DecimalFormat("###,####.000");
System.out.println(format.format(111111123456.1227222));
Locale.setDefault(Locale.US);
DecimalFormat usFormat = new DecimalFormat("###,###.000");
System.out.println(usFormat.format(111111123456.1227222));
DecimalFormat addPattenFormat = new DecimalFormat();
addPattenFormat.applyPattern("##,###.000");
System.out.println(addPattenFormat.format(111111123456.1227));
DecimalFormat zhiFormat = new DecimalFormat();
zhiFormat.applyPattern("0.000E0000");
System.out.println(zhiFormat.format(10000));
System.out.println(zhiFormat.format(12345678.345));
DecimalFormat percentFormat = new DecimalFormat();
percentFormat.applyPattern("#0.000%");
System.out.println(percentFormat.format(0.3052222));
運(yùn)行結(jié)果 :
1111,1112,3456.123
111,111,123,456.123
111,111,123,456.123
1.000E0004
1.235E0007
30.522%
如果使用具有多個分組字符的模式,則最后一個分隔符和整數(shù)結(jié)尾之間的間隔才是使用的分組大小。所以 "#,##,###,####" == "######,####" == "##,####,####"。
我們經(jīng)常要將數(shù)字進(jìn)行格式化,比如取2位小數(shù),這是最常見的。Java 提供 DecimalFormat 類,幫你用最快的速度將數(shù)字格式化為你需要的樣子。下面是常用的例子:
import java.text.DecimalFormat;
public class Test{
public static void main(String[] args){
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
//以百分比方式計數(shù),并取兩位小數(shù)
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
long c=299792458;//光速
//顯示為科學(xué)計數(shù)法,并取五位小數(shù)
System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8
//顯示為兩位整數(shù)的科學(xué)計數(shù)法,并取四位小數(shù)
System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7
//每三位以逗號進(jìn)行分隔。
System.out.println(new DecimalFormat(",###").format(c));//299,792,458
//將格式嵌入文本
System.out.println(new DecimalFormat("光速大小為每秒,###米").format(c)); //光速大小為每秒299,792,458米
}
}
DecimalFormat 類主要靠 # 和 0 兩種占位符號來指定數(shù)字長度。0 表示如果位數(shù)不足則以 0 填充,# 表示只要有可能就把數(shù)字拉上這個位置。上面的例子包含了差不多所有的基本用法,如果你想了解更多,請參考 DecimalFormat 類的文檔。
今天遇到一個奇怪的問題,就是java.text.DecimalFormat的format方法遇到小數(shù)位5不進(jìn)位的問題。
例如:
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("#.##");
String testStr = df.format(3.165);
System.out.println(testStr);
輸出的結(jié)果是:
3.16
Process finished with exit code 0
原因是這個函數(shù)的默認(rèn)舍入策略是四舍六入五奇偶。具體策略如下:
如4.56就是4.6,最后一位小數(shù)大于等于6就向前進(jìn)一位.
4.54就是4.5,最后一位小數(shù)小于等于4,就舍去
4.45就是4.4 4.55就是4.6最后一位小數(shù)是5的時候,當(dāng)前一位是奇數(shù)的時候就進(jìn)一位湊成偶數(shù),當(dāng)前一位是偶數(shù)的時候就舍去.
所以如果要使用我們常用的四舍五入,需要加一句:
df.setRoundingMode(RoundingMode.HALF_UP);
搞定!
DecimalFormat適用于十進(jìn)制數(shù)字的格式化
//沒有帶數(shù)字格式的實(shí)例化
// DecimalFormat format = new DecimalFormat();
// format.applyPattern("#");//當(dāng)實(shí)例化沒有傳遞數(shù)字格式的時候,使用該方法傳入數(shù)字格式
//數(shù)字格式的實(shí)例化
DecimalFormat format = new DecimalFormat("#");
/**
* java.math.RoundingMode
* 遠(yuǎn)離零方向舍入的舍入模式。始終對非零舍棄部分前面的數(shù)字加 1。注意,此舍入模式始終不會減少計算值的絕對值。
* RoundingMode.UP 舍入為一位數(shù)1.1-> 2 2.5->3 -1.1->-2
* 向零方向舍入的舍入模式。從不對舍棄部分前面的數(shù)字加 1(即截尾)。注意,此舍入模式始終不會增加計算值的絕對值。
* RoundingMode.DOWN 舍入為一位數(shù) 1.1->1 2.5->2 -1.1->-1
* 向正無限大方向舍入的舍入模式。如果結(jié)果為正,則舍入行為類似于 RoundingMode.UP;如果結(jié)果為負(fù),則舍入行為類似于 RoundingMode.DOWN
* RoundingMode.CEILING 舍入為一位數(shù) 1.1->2 2.5->3 -1.1->-1 -2.5->-2
* 向負(fù)無限大方向舍入的舍入模式。如果結(jié)果為正,則舍入行為類似于 RoundingMode.DOWN;如果結(jié)果為負(fù),則舍入行為類似于RoundingMode.UP
* RoundingMode.FLOOR 舍入為一位數(shù) 1.1->1 2.5->2 -1.1->-2 -2.5->-3
* 向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向上舍入。如果被舍棄部分 >= 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常學(xué)校里講的四舍五入。
* RoundingMode.HALF_UP 舍入為一位數(shù) 1.1->1 2.5->2 -1.1->-1 -2.5->-3
* ...
*/
format.setRoundingMode(RoundingMode.HALF_UP);//設(shè)置格式化時的舍入方式
// public final String format (Object obj) 表示可以傳遞任意參數(shù)
// public final String format(double number)\
// public final String format(long number)...
String result = format.format(123123.123123);//參數(shù)表示需要格式化的數(shù)字或者數(shù)字類型的字符串 result就是格式化后的字符串
特殊字符說明
“0” 指定位置不存在數(shù)字則顯示為0 123.123 ->0000.0000 ->0123.1230
"#" 指定位置不存在數(shù)字則不顯示 123.123 -> ####.#### ->123.123
"." 小數(shù)點(diǎn)
"%" 會將結(jié)果數(shù)字乘以100 后面再加上% 123.123 ->#.00->1.3212%
api中文幫助文檔關(guān)于"#"的翻譯是錯誤的,原文為“zero shows as absent”譯為“如果為0,則不顯示”。
代碼示例:
new java.text.DecimalFormat("#.###").format(3.0)
new java.text.DecimalFormat("0.000").format(3.0)
輸出的結(jié)果為: 3 和3.000
"#"可以理解為在正常的數(shù)字顯示中,如果前綴與后綴出現(xiàn)不必要的多余的0,則將其忽略。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點(diǎn)擊進(jìn)入論壇