程式扎記: [ Java 文章收集 ] Double 四捨五入保留 n 位小數與貨幣文字處理

標籤

2011年9月27日 星期二

[ Java 文章收集 ] Double 四捨五入保留 n 位小數與貨幣文字處理

轉載自 這裡
前言 :
在很多時候在處理數字時, 應為數字很大所以你希望替換單位改用較小的數字(byte -> kbyte -> mbyte)來顯示. 這時就涉及小數點的問題. 這裡介紹如何在 Java 進行設定顯示小數點第幾位與常見貨幣顯示轉換. 常見方法如下 :
- 使用 BigDecimal : 

  1. double dout=28.965432;   
  2. BigDecimal bd= new BigDecimal(dout);   
  3. bd=bd.setScale(4, BigDecimal.ROUND_HALF_UP);// 小數後面四位, 四捨五入   
  4. System.out.println(bd.doubleValue());  
執行結果 :
28.9654

關於Java的數據格式化 :
常見的數字格式轉換可以使用類別 DecimalFormat. 你可以透過其建構子將數字的格式傳入. 常見格式字元如下 :


底下為簡單範例 :
  1. DecimalFormat df = new DecimalFormat("0.00");   
  2. double douNum = 53423123231.51323;   
  3. String str = df.format(douNum);  
轉換結果為 : 53423123231.51
保留幾位小數由你的DecimalFormat實例決定,如果想保留三位,則如下定義 :
DecimalFormat df = new DecimalFormat("0.000");

數據格式化相關類介紹 :
- java.util.* :
Locale 表示一個語言和區域的特定組合
ResourceBundle ListResourceBundle
PropertyResourceBundle 獲取本地化資源中(可以表現為類和資源文件)的信息
Calendar GregorianCalendar 日曆的支持
TimeZone SimpleTimeZone 時區的支持
Currency 單獨處理和貨幣相關的操作

- java.text.* :
Format NumberFormat
DecimalFormat 格式化格式化數字、貨幣以及百分數
ChoiceFormat 處理複數形式
DateFormat SimpleDateFormat 日期和時間的格式化
MessageFormat 消息的格式化
DecimalFormatSymbolsDateFormatSymbols 自定義格式化中的符號集
FieldPosition 被 Format 及其子類用來在格式化輸出中標識字段
Collator RuleBasedCollator 字符串操作比較字符串
CollationElementIterator 獲得一個字符串中單個字符的枚舉信息
CollationKey 優化比較性能
BreakIterator 獲得文本中的個體信息,比如字符、單詞、句子以及整行等信息

國際化及 MessageFormat 類 :
MessageFormat運行開發者輸出文本中的變量的格式,它主要用於國際化。它是一個強大的類,就像下面的例子展示的那樣 :
  1. String message = "Once upon a time ({1,date}, "  
  2.         + "around about {1,time,short}), there "  
  3.         + "was a humble developer named Geppetto"  
  4.         + " who slaved for {0,number ,integer}"  
  5.         + " days with {2,number,percent} complete"  
  6.         + " user requirements. ";  
  7. Object[] variables = new Object[] { new Integer(4), new Date(),  
  8.         new Double(0.21) };  
  9. String output = MessageFormat.format(message, variables);  
  10. System.out.println(output);  
隱藏在信息中的是描述輸出的格式的一種短小的代碼,範例的輸出如下 :
Once upon a time (2011/9/27, around about 下午 1:51), there was a humble developer named Geppetto who slaved for 4 days with 21% complete user requirements.

如果相同的信息需要被重複輸出但是變量的值不同, 便可以很輕鬆的替換傳入的變數 variables 即可動態變更輸出內容!. 除了可以處理日期、時間、數字和百分數外,MessageFormat 也可以處理貨幣,運行更多的數字格式的控制並且允許指定ChoiceFormat.

使用Currency進行貨幣計算 :
如果您來自美國,您會在較大的數值中間放置逗號來表示千和百萬(等等,每三個數值使用一個逗號).對於浮點數,您將在整數部分和小數部分之間放置小數點。對於金錢,貨幣符號 $ 放在金額的前面。如果您從來沒有到過美國以外的地方,可能就不會關心用英鎊(£)來格式化的英國貨幣,或者用歐元()來表示的其他歐洲國家的貨幣.

對於那些我們確實關心的貨幣,我們可以使用 NumberFormat 及其相關的類來格式化它們。開發人員使用 NumberFormat 類來讀取用戶輸入的數值,並格式化將要顯示給用戶看的輸出. NumberFormat 是一個抽像類並提供了一系列getXXXInstance() 方法,用以獲得不同類型的數值類的特定地區版本. 這樣的方法共有五個 :

具體使用哪一個方法取決於您想要顯示的數值類型(或者想要接受的輸入類型).每個方法都提供了兩個版本. 一個版本適用於當前地區,另一個版本接受一個 Locale 作為參數,以便可能地指定一個不同的地區. 透過getCurrencyInstance() 引入, 您能將 Currency 當作 NumberFormat 使用,然而除了它們的數字顯示外,您不能獲得或顯示某個地區的貨幣符號. 有了Currency 類,現在很容易就可以做到這一點.

貨幣代碼來自ISO 4217. 通過傳入某個國家的 Locale 或者貨幣的實際字母代碼,Currency.getInstance() 將返回一個有效的 Currency 對象. NumberFormat 的 getCurrency() 方法將在創建特定地區的貨幣實例之後做同樣的事情. 下面代碼顯示瞭如何獲得貨幣實例,以及如何格式化將要顯示為貨幣的數值. 記住這些轉換僅用於顯示, 如果需要在貨幣之間轉換金額,應該在確定如何顯示值之前進行幣值轉換 :
  1. StringBuffer buffer = new StringBuffer(100);  
  2. Currency dollars = Currency.getInstance("USD");  
  3. Currency pounds = Currency.getInstance(Locale.UK);  
  4. buffer.append("Dollars: ");  
  5. buffer.append(dollars.getSymbol());  
  6. buffer.append("\n");  
  7. buffer.append("Pound Sterling: ");  
  8. buffer.append(pounds.getSymbol());  
  9. buffer.append("\n-----\n");  
  10. double amount = 5000.25;  
  11. NumberFormat usFormat = NumberFormat.getCurrencyInstance(Locale.US);  
  12. buffer.append("Symbol: ");  
  13. buffer.append(usFormat.getCurrency().getSymbol());  
  14. buffer.append("\n");  
  15. buffer.append(usFormat.format(amount));  
  16. buffer.append("\n");  
  17. NumberFormat germanFormat = NumberFormat  
  18.         .getCurrencyInstance(Locale.GERMANY);  
  19. buffer.append("Symbol: ");  
  20. buffer.append(germanFormat.getCurrency().getSymbol());  
  21. buffer.append("\n");  
  22. buffer.append(germanFormat.format(amount));  
  23. JFrame frame = new JFrame("Currency");  
  24. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  25. JTextArea ta = new JTextArea(buffer.toString());  
  26. JScrollPane pane = new JScrollPane(ta);  
  27. frame.getContentPane().add(pane, BorderLayout.CENTER);  
  28. frame.setSize(200200);  
  29. frame.show();  
執行結果 :

沒有留言:

張貼留言

網誌存檔