2014-06-29

格式化輸出

Java主要有3種格式化輸出的方式:
1. 跟C相同有printf()可以使用
2. NumberFormat: 可以印出金錢的格式等等
3. DecimalFormat: 有豐富功能的格式化輸出
雖然printf方便又好用,
但一些Java程式員會偏好使用後兩者,比較符合OOP的精神。

import java.text.NumberFormat;
import java.text.DecimalFormat;
import java.util.Locale;

NumberFormat moneyDefault = NumberFormat.getCurrencyInstance();
System.out.println(moneyDefault.format(123.456)); // NT$123.46
NumberFormat moneyJapan = NumberFormat.getCurrencyInstance(Locale.JAPAN);
System.out.println(moneyJapan.format(98.76));     // ¥99

DecimalFormat pattern1 = new DecimalFormat("00.000");
DecimalFormat pattern2 = new DecimalFormat("0.00");
DecimalFormat pattern3 = new DecimalFormat("#0.0##");
double number1 = 12.3456789;
double number2 = 1.23456789; 
System.out.println(pattern1.format(number1)); // 12.346
System.out.println(pattern2.format(number1)); // 12.35
System.out.println(pattern3.format(number1)); // 12.346
System.out.println(pattern3.format(number2)); // 1.235

1. NumberFormat

如上例,getCurrencyInstance()可以回傳NumberFormat物件,
不給引數則預設為預設地區(locale)的金錢格式,
也可以在引數中指定要用哪個地區的金錢格式。
第5行沒有給引數,因此預設為目前的地區(台灣),
而第7行則指定為日本地區。

getCurrencyInstance()會自動四捨五入到小數點後第二位,
因此第6行的123.456會格式化輸出成NT$123.46;
有趣的一點是,日円沒有小於1的幣值,
因此98.76會自動四捨五入到整數位,得到¥99。


2. DecimalFormat

DecimalFormat是使用pattern字串去格式化數字,
'0'代表需要的位元,'#'代表選擇性的位元,
當'#'位元不是0時則會顯示出來,反之則不會顯示。
由'#'的顯示特性可知道,
在小數點前,'#'必須出現在'0'之前;
在小數點後,'#'必須出現在'0'之後。
因此"#0.0##"是合法的,"0#.0##"、"#0.##0"是不合法的。

如上例,
pattern1("00.000")代表小數點前需要2個位元、小數點後需要3個位元,
因此第15行使用pattern1去格式化number1(12.3456789)得到12.346。
(與NumberFormat一樣會做四捨五入的動作)
而雖然pattern2("0.00")代表小數點前需要1個位元,但超出的部分還是會顯示,
因此第16行使用pattern2去格式化number1得到的是12.35。

pattern3("#0.0##")代表小數點前需要1~2個位元、小數點後需要1~3個位元,
因此第17行使用pattern3去格式化number1得到12.346,
第18行使用pattern3去格式化number2得到1.235。

DecimalFormat還有許多其他格式化的功能,
像是在pattern尾端加入'%'可格式化成百分比,
或是在pattern中加入'E'以表示科學記號,(科學記號pattern比較複雜)
有興趣的可以自己研究一下。

參考Java API:NumberFormatDecimalFormat

沒有留言:

張貼留言