1. 程式人生 > 其它 >Java數字格式類 NumberFormat | DecimalFormat

Java數字格式類 NumberFormat | DecimalFormat

技術標籤:Javajava數字格式化

文章目錄

Java數字格式類

以下兩個類可用於格式化和解析數字:

  • java.text.NumberFormat
  • java.text.DecimalFormat

NumberFormat類

1.基本介紹

NumberFormat 類可以將一個數值格式化為符合某個國家地區習慣的數值字串,也可以將符合某個國家地區習慣的數值字串解析為對應的數值。

Java8API文件 https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html

方法:

format 方法:將一個數值格式化為符合某個國家地區習慣的數值字串
parse 方法:將符合某個國家地區習慣的數值字串解析為對應的數值
    
例項化NumberFormat類(在例項化時,可以使用 Locale 物件作為引數,也可以不使用):
getXXXInstance() 方法:返回NumberFormat例項物件
getInstance():以預設語言環境返回NumberFormat例項物件
    
getNumberInstance(Locale locale):以引數Locale 物件所標識的本地資訊來獲得具有多種用途的NumberFormat例項物件(沒什麼實際作用)
getIntegerInstance(Locale locale):以引數locale物件所標識的本地資訊來獲得處理整數的NumberFormat例項物件(沒什麼實際作用) getCurrencyInstance(Locale locale):以引數locale物件所標識的本地資訊來獲得處理貨幣的NumberFormat例項物件 getPercentInstance(Locale locale):以引數locale物件所標識的本地資訊來獲得處理百分比數值的NumberFormat例項物件
2.使用案例

NumberFormatDemo

public class NumberFormatDemo
{ public static void main(String[] args) throws ParseException { int price = 18; NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA); System.out.println(nf.format(price));//輸出:¥18.00 nf = NumberFormat.getCurrencyInstance(Locale.US); System.out.println(nf.format(price));//輸出:$18.00 nf = NumberFormat.getCurrencyInstance(Locale.GERMAN); System.out.println(nf.format(price));//輸出:¤ 18,00 String str = "¤ 18,00"; Number n = nf.parse(str); System.out.println(n.doubleValue());//輸出 18 double d = 0.5; nf = NumberFormat.getPercentInstance(Locale.CHINA); System.out.println(nf.format(d));//50% } }

測試結果:

image-20201230171247676

3.應用場景

1.Java使用 int 資料計算百分比

public class NumberFormatDemo {
	
	public static void main(String[] args) throws ParseException {
  		int n1 = 0;
        int n2 = 0;
        //建立一個數值格式化物件
        NumberFormat nf = NumberFormat.getInstance();
        //設定精確到小數點後2位
        nf.setMaximumFractionDigits(2);
        String res1;
        if(n2 == 0){
            //除數不能為0
            res1 = "0";
        }else{
            res1 = nf.format((float) n1 / (float) n2 * 100);
        }
        System.out.println("百分比為:" + res1 + "%");
	}
}

DecimalFormat類

1.基本介紹

DecimalFormat 類是NumberFormat 十進位制數字格式的具體子類。旨在解析格式化任何語言環境中的數字,包括支援西方、阿拉伯語和印度語數字。

支援不同型別的數字,包括整數(123)、定點數(123.4)、科學計數法(1.23E4),百分比(12%)和貨幣金額(123美元)。

對於數值的小數部分,預設顯示3位小數,在去掉超出小數點3位以後的部分時,會將數值四捨五入為最接近的數值格式化輸出。

特殊模式字元:

*符號**地點**本地化?**含義*
0數字,被格式化數值不夠的位數補零,若夠則不變
#數字,被格式化數值不夠的位數忽略,若夠則不變
.小數分隔符或貨幣小數分隔符
-減號,預設負數字首
,分組分隔符
E用科學記數法分隔尾數和指數。 不需要在字首或字尾中引用。
;子模式邊界將正面和負面的子圖案分開
%字首或字尾乘以100並顯示為百分比
\u2030字首或字尾乘以1000並顯示為千分數,顯示出來為‰
¤(\u00A4)字首或字尾沒有貨幣符號,由貨幣符號取代。如果加倍,則用國際貨幣符號代替。如果存在於模式中,則使用貨幣小數分隔符而不是小數分隔符。
字首或字尾沒有用於引用字首或字尾中的特殊字元,例如,"’#’#“格式為123到 “#123”。要建立單引號本身,請連續使用兩個:”# o’'clock"。

構造方法:

DecimalFormat()  使用預設語言環境的預設模式和符號建立物件。其中隱含設定了三個數一組,若呼叫該方法如123456.789->123,456.789
DecimalFormat(String pattern) 使用給定模式和預設語言環境的符號建立物件。
DecimalFormat(String pattern, DecimalFormatSymbols symbols) 使用給定的模式和符號建立物件
//pattern - 非本地化的模式字串
//symbols - 要使用的符號集

注:第三個構造方法一般不怎麼用到,若需要可參考 DecimalFormatSymbols類

Java8API文件 https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormatSymbols.html

方法:

format()和parse()的呼叫和DateFormat類的呼叫方法相同。

format(Number->String)parse(String->Number)

其中,常用的成員方法有:

1applyPattern()方法,將給定的模式應用於Format物件

(2getPositivePrefix()方法,獲取正字首
    getPositiveSuffix()方法,獲取正後綴
    setPositivePrefix(String newValue)方法,設定正字首     
    setPositiveSuffix(String newValue)方法,設定正後綴

(3getNegativePrefix()方法,獲取否字首         
    getNegativeSuffix()方法,獲取否字尾
	setNegativePrefix(String newValue)方法,設定否字首      
    setNegativeSuffix(String newValue)方法,設定否字尾

(4getCurrency()方法,獲取格式化貨幣值時此十進位制格式使用的貨幣。

(5getGroupingSize()方法,返回分組大小。分組大小是數字的整數部分中分組分隔符之間的位數。例如,在數字“123,456.78”中,分組大小為3

更多詳細方法參見:java8API文件 https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

基本語法:

1、字首和字尾:數字前後的符號,除\uFFFE、\uFFFF和特殊字元以外的所有Unicode字元。

2、如果使用具有多個分組字元的模式,則最後一個分隔符和整數結尾之間的間隔才是使用的分組大小。如"#,##,###,####"的分組為43、整數部分,#號放在0的左邊
4、小數部分,#號放在0的右邊
2.使用案例
public class DecimalFormatDemo {
	
	public static void main(String[] args) throws ParseException {
  		double d=156.22359646;
        System.out.println(new DecimalFormat("0").format(d));//被格式化的數值位數夠,則取所有整數
        System.out.println(new DecimalFormat("#").format(d));//被格式化的數值位數夠,則取所有整數
        System.out.println(new DecimalFormat("00000.###").format(d));//被格式化的數值位數不夠,則整數位不夠的補零
        System.out.println(new DecimalFormat("#.######\u2030").format(d));//以千分比方式計數並且保留6位小數
        System.out.println(new DecimalFormat("#.##%").format(d));//以百分比方式計數並且保留2位小數
        long c=4673568;
        System.out.println(new DecimalFormat("#.#####E00").format(c));//顯示為科學計演算法,並保留5為小數且被格式化的數值位數不夠,不夠的補零
        System.out.println(new DecimalFormat("00.####E0").format(c));//顯示為科學計數法,並保留2位整數,4位小數
        System.out.println(new DecimalFormat("####,###").format(c));//毎三位用逗號分隔
        System.out.println(new DecimalFormat("資料分隔後為,##大小").format(c));
	}
}

測試結果:

image-20201230203915227

應用場景後續待更新。。。