【Java基础】使用NumberFormat 、DecimalFormat进行数字格式化
文章目錄
- 一.NumberFormat
- 1.基本介紹
- 2.實(shí)例化方法
- 3.貨幣格式化
- 4.百分比格式化
- 5.簡(jiǎn)單工具類(lèi)
- 二.DecimalFormat
- 1.基本介紹
- 2.常見(jiàn)符號(hào)
- 3.使用
- 3.1. "0" 和 "#"配合使用
- 3.2. 科學(xué)計(jì)數(shù)法 "E"
- 3.3. 分組分隔符和減號(hào)
- 3.3.1.分組分隔符 ","
- 3.3.2.減號(hào) "-"
- 3.4. 關(guān)于前綴、后綴
- 3.4.1. "%" 將數(shù)字乘以100
- 3.4.2. "\u2030" 將數(shù)字乘以1000
- 3.4.3. "¤(\u00A4)" 本地化貨幣符號(hào)
- 3.4.4. " ' " 用于引用特殊的字符,作為前綴或后綴。
- 3.5. 四舍五入
- 3.6. 同步
- 3.7. 特殊值
一.NumberFormat
1.基本介紹
- NumberFormat 是所有數(shù)值格式的抽象父類(lèi)。此類(lèi)提供格式化和解析數(shù)值的接口。
- NumberFormat 還提供了一些方法來(lái)確定哪些語(yǔ)言環(huán)境具有數(shù)值格式,以及它們的名稱(chēng)是什么。
- NumberFormat 可用于格式化和解析任何語(yǔ)言環(huán)境的數(shù)值。使代碼能夠完全獨(dú)立于小數(shù)點(diǎn)、千位分隔符甚至所用特定小數(shù)位數(shù)的語(yǔ)言環(huán)境約定,并與數(shù)值格式是否為偶小數(shù)無(wú)關(guān)。
2.實(shí)例化方法
- getInstance()、getNumberInstance()。返回當(dāng)前默認(rèn)語(yǔ)言環(huán)境的通用數(shù)值格式。
- getInstance(Locale)、getNumberInstance(Locale)。返回指定語(yǔ)言環(huán)境的通用數(shù)值格式。
- NumberFormat.setMinimumIntegerDigits(int)。設(shè)置數(shù)的整數(shù)部分所允許的最小位數(shù)。
- NumberFormat.setMaximumIntegerDigits(int)。設(shè)置數(shù)的整數(shù)部分所允許的最大位數(shù)。
- NumberFormat.setMinimumFractionDigits(int)。設(shè)置最少小數(shù)點(diǎn)位數(shù),不足的位數(shù)以0補(bǔ)位,超出的話(huà)按實(shí)際位數(shù)輸出。
- NumberFormat.setMaximumFractionDigits(int)。設(shè)置最多保留小數(shù)位數(shù),不足不補(bǔ)0。
3.貨幣格式化
4.百分比格式化
5.簡(jiǎn)單工具類(lèi)
import java.text.DecimalFormat; import java.text.NumberFormat;public class NumberDealUtil {/*** 移除數(shù)字前面和后面冗余的0,只保留3位小數(shù)** @param isFormat 是否需要千位分隔符(,)這種格式輸出* @param num* @return*/public static String trim0(boolean isFormat, double num) {NumberFormat nf = NumberFormat.getInstance();if (!isFormat) {//設(shè)置輸出格式是否使用“,”分組,默認(rèn)是使用的nf.setGroupingUsed(false);}String result = nf.format(num); // return isFormat ? result : result.replace(",", ""); //用上面代碼替換去除分隔符操作return result;}/*** 移除數(shù)字前面和后面冗余的0** @param isFormat 是否需要千位分隔符(,)這種格式輸出* @param num* @param fractionDigit 要保留的小數(shù)位數(shù)* @return*/public static String trim0(boolean isFormat, double num, int fractionDigit) {NumberFormat nf = NumberFormat.getInstance();nf.setMaximumFractionDigits(fractionDigit);//setMaximumFractionDigits不會(huì)保留小數(shù)點(diǎn)和后面多余的0,不需下面正則去除 // if (result.contains(".") && result.endsWith("0")) { // result = result.replaceAll("0+?$", "");//去掉多余的0 // result = result.replaceAll("[.]$", "");//如最后一位是.則去掉 // }if (!isFormat) {//設(shè)置輸出格式是否使用“,”分組,默認(rèn)是使用的nf.setGroupingUsed(false);}String result = nf.format(num); // return isFormat ? result : result.replace(",", "");return result;}/*** 指定位數(shù)輸出,不足補(bǔ)0* 整數(shù)部分如果位數(shù)大于需要的位數(shù)按實(shí)際位數(shù)輸出* 小數(shù)部分如果大于需要的位數(shù)四舍五入** @param num* @param integerDigit 整數(shù)部分位數(shù)* @param fractionDigit 小數(shù)部分位數(shù)* @return*/public static String add0Format(double num, int integerDigit, int fractionDigit) {StringBuilder rule = new StringBuilder();if (integerDigit <= 0) {rule.append("#");} else {for (int i = 0; i < integerDigit; i++) {rule.append("0");}}if (fractionDigit > 0) {rule.append(".");for (int i = 0; i < fractionDigit; i++) {rule.append("0");}}DecimalFormat df = new DecimalFormat(rule.toString());return df.format(num);}/*** 保留幾位小數(shù),不足不補(bǔ)0,小數(shù)部分冗余的0也不顯示** @param num* @param fractionDigit 要保留小數(shù)的位數(shù)* @return*/public static String fractionDigitFormat(double num, int fractionDigit) {/*方法一*/ // StringBuilder rule = new StringBuilder("#"); // if (fractionDigit > 0) { // rule.append("."); // for (int i = 0; i < fractionDigit; i++) { // rule.append("#"); // } // } // DecimalFormat df = new DecimalFormat(rule.toString()); // return df.format(num);/*方法二*/NumberFormat nf = NumberFormat.getInstance();nf.setMaximumFractionDigits(fractionDigit);//設(shè)置輸出格式是否使用“,”分組,這里不使用nf.setGroupingUsed(false);return nf.format(num);} }二.DecimalFormat
1.基本介紹
DecimalFormat 是 NumberFormat 的一個(gè)具體子類(lèi),用于格式化十進(jìn)制數(shù)字。包含一個(gè)模式和一組符號(hào)。
-
主要靠 # 和 0 兩種占位符號(hào)來(lái)指定數(shù)字長(zhǎng)度。
-
“0”:表示一位數(shù)值,如沒(méi)有,顯示0。
- 如“0000.0000”,整數(shù)位或小數(shù)位>4,按實(shí)際輸出,<4整數(shù)位前面補(bǔ)0小數(shù)位后面補(bǔ)0,湊足4位。
-
“#”:表示任意位數(shù)的整數(shù)。如沒(méi)有,則不顯示。在小數(shù)點(diǎn)位使用,只表示一位小數(shù),超出部分四舍五入。
- 如:“#”:無(wú)小數(shù),小數(shù)部分四舍五入。“.#”:整數(shù)部分不變,一位小數(shù),四舍五入。“.##”:整數(shù)部分不變,二位小數(shù),四舍五入。
2.常見(jiàn)符號(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" |
3.使用
3.1. “0” 和 "#"配合使用
import java.text.DecimalFormat;public class NumberFormatTest {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//以百分比方式計(jì)數(shù),并取兩位小數(shù)System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%System.out.println("");//光速long c = 299792458;//顯示為科學(xué)計(jì)數(shù)法,并取五位小數(shù)System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8//顯示為兩位整數(shù)的科學(xué)計(jì)數(shù)法,并取四位小數(shù)System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7//每三位以逗號(hào)進(jìn)行分隔。System.out.println(new DecimalFormat(",###").format(c));//299,792,458//將格式嵌入文本System.out.println(new DecimalFormat("光速大小為每秒,###米。").format(c));System.out.println("");pi = 12.34;//整數(shù)System.out.println(new DecimalFormat("6").format(pi));//612System.out.println(new DecimalFormat("60").format(pi));//612System.out.println(new DecimalFormat("06").format(pi));//126System.out.println(new DecimalFormat("00600").format(pi));//00126System.out.println(new DecimalFormat("#####60000").format(pi));//00126//小數(shù)System.out.println(new DecimalFormat(".6").format(pi));//12.6System.out.println(new DecimalFormat(".06").format(pi));//12.36System.out.println(new DecimalFormat(".60").format(pi));//12.36System.out.println(new DecimalFormat(".0600").format(pi));//12.3406System.out.println(new DecimalFormat(".6000").format(pi));//12.3406System.out.println(new DecimalFormat(".600000##").format(pi));//12.340006} }測(cè)試結(jié)果
我們來(lái)對(duì)比分析一下上面兩個(gè)值,很明顯.就是我們常用的小數(shù)點(diǎn)分隔符,前面是整數(shù),后面是小數(shù)。
1.整數(shù):若是n個(gè)0,就從個(gè)位開(kāi)始向高位填充,如果有值就是原來(lái)的值,沒(méi)有就填充0。
??????? 若都是#,沒(méi)有實(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ù)不足部分沒(méi)有就是沒(méi)有。
??????? 0和#配合使用,只能是".00##",不能是".##00",就是0在前#在后。實(shí)現(xiàn)和上面一樣。
3.數(shù)字(1-9):上面的分析不是#就是0,如果是其他的數(shù)值會(huì)怎樣呢?
上面的擴(kuò)展很詳細(xì)的說(shuō)明這個(gè)問(wèn)題。
??????? 整數(shù):若沒(méi)有0或#,默認(rèn)在后面拼接整數(shù);若有0或#,找到第一個(gè)0或#的位置,然后找出所有的0或#拼在一起,按照上面的規(guī)則,在第一個(gè)0或#出現(xiàn)的位置插入響應(yīng)的格式化以后的值。
??????? 小數(shù):若沒(méi)有0或#,格式化是什么就顯示什么;若有0或#,找出所有的0或#拼在一起,按照上面的規(guī)則,在小數(shù)點(diǎn)的后面插入響應(yīng)的格式化以后的值。
3.2. 科學(xué)計(jì)數(shù)法 “E”
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.3E0pi = 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é):
3.3. 分組分隔符和減號(hào)
3.3.1.分組分隔符 “,”
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.3.2.減號(hào) “-”
-表示輸出為負(fù)數(shù), 要放在最前面。代碼如下:
pi = 3.14; System.out.println(new DecimalFormat("-0.00").format(pi));//-3.143.4. 關(guān)于前綴、后綴
3.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.343.4.2. “\u2030” 將數(shù)字乘以1000
\u2030和%用法是一樣的。
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.403.4.3. “¤(\u00A4)” 本地化貨幣符號(hào)
如果連續(xù)出現(xiàn)2次,代表貨幣符號(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.57CNY3.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.573.5. 四舍五入
說(shuō)的就是我們數(shù)學(xué)上常說(shuō)的四舍五入的問(wèn)題。
DecimalFormat 提供 RoundingMode中定義的舍入模式進(jìn)行格式化。默認(rèn)情況下,它使用 Round ingMode.HALF_EVEN。
3.6. 同步
DecimalFormat 通常不是同步的。建議為每個(gè)線程創(chuàng)建獨(dú)立的格式實(shí)例。如果多個(gè)線程同時(shí)訪問(wèn)某個(gè)格式,則必須保持外部同步。
3.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é)
以上是生活随笔為你收集整理的【Java基础】使用NumberFormat 、DecimalFormat进行数字格式化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据结构基础:算法的基础知识笔记
- 下一篇: 数据结构基础:图结构的学习笔记