2011-10-19 236 views
18

我正在盡最大努力找到一種方法來使用Java在各種不屬於該貨幣的語言環境中設置外幣的格式。我發現了java.util.Currency,它可以表示適用於各種語言環境的正確符號。也就是說,對美元而言,它在美國爲我提供了$,在其他國家提供了美元或美元。另外,我找到了java.text.NumberFormat,它將爲特定區域設置貨幣格式。我的問題 - util.Currency將提供適當的符號和代碼來表示非默認區域中的貨幣,但不會以任何特定於區域的方式格式化貨幣。 NumberFormat假定我通過它的數字是語言環境,該語言環境的貨幣爲不是外幣。例如,如果我使用getCurrencyInstance(Locale.GERMANY),然後格式化爲(1000),則假定我格式化爲1000歐元。實際上,我可能需要以美元或日元或任何其他貨幣的正確的德國本地化表示形式(正確的小數和千位分隔符,是將符號放在金額前後)。迄今爲止我能夠推導出的最好的方法是使用NumberFormat格式化數字,然後搜索非數字字符的輸出,並將其替換爲從util.Currency派生的符號。然而,這是非常脆弱的,可能不足以達到我的目的。想法?任何幫助深表感謝。在Java中的國外語言環境中格式化貨幣

+0

'1)'是您在GUI某處顯示此數據, '2)'我從來沒有嘗試過(ISO CCY代碼之後改變不這樣做此操作rellevant)那麼我的問題是你嘗試過美元,澳元,新元也許有符號$, '3)''我建議尋找ISO代碼,而不是混合和設置不同的區域設置,例如因爲out_dated http:/ /萬維網。oanda.com/help/currency-iso-code-country但首先來自谷歌, – mKorbel

+0

與此相關的原因是,您不應該將資金存儲在原始的「他們自己的」中:他們應該是一個類的一部分,還包含他們代表的貨幣(500美元不是500日元)。 –

+0

您是否看到我在下面給出的答案?這能解決問題嗎? – les2

回答

40

嘗試通過getCurrencyInstance(Locale.GERMANY)返回的實例

破碎使用setCurrency

java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY); 
System.out.println(format.format(23)); 

輸出:23,00€

固定

java.util.Currency usd = java.util.Currency.getInstance("USD"); 
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY); 
format.setCurrency(usd); 
System.out.println(format.format(23)); 

輸出:23,00 USD

+1

工程就像一個魅力!謝謝! – JPittard

+0

你保存完成手動編碼!哈哈:D –

+2

更好的結帳Testo Testini的答案在下面。 – les2

22

我想補充的les2 https://stackoverflow.com/a/7828512/1536382,我相信的小數數不從貨幣拍攝,必須手動設置爲應答,否則,如果客戶端(的NumberFormat)擁有日本區域和貨幣是歐元或en_US,那麼金額顯示爲'la'Yen',沒有小數位數,但這不像預期的那樣,因爲歐元小數點是相關的,對日本也是如此;-)。

因此,可以通過添加format.setMaximumFractionDigits(usd.getDefaultFractionDigits());來改進示例2,在該示例的特定情況下該示例不相關,但它使用帶有小數的數字和Locale.JAPAN作爲NumberFormat的語言環境變得相關。

java.util.Currency usd = java.util.Currency.getInstance("USD"); 
    java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(
      java.util.Locale.JAPAN); 
    format.setCurrency(usd); 
    System.out.println(format.format(23.23)); 
    format.setMaximumFractionDigits(usd.getDefaultFractionDigits()); 
    System.out.println(format.format(23.23)); 

將輸出:

USD23 
USD23.23 

NumberFormat code類似的東西是爲格式的初始/默認貨幣完成的,調用方法DecimalFormat#adjustForCurrencyDefaultFractionDigits。當貨幣與NumberFormat.setCurrency

+0

好的。這真的很乏味,要求成爲一個公用事業圖書館,例如公用貨幣。有一個存在嗎? CurrencyUtils.getFormatter(Locale,Currency).format(BigDecimal) – les2

+0

對於任何可能被此行爲叮咬的人,請留下以下內容:在Android上(特別是帶有4.3的Samsung Galaxy Note 2),使用locale de_CH(Deutsch(Schweiz)),if我得到默認的貨幣格式化程序,並調用setCurrency(「CAD」),我會得到「瑞典語」四捨五入。也就是說,26.98的值被格式化爲27.00!但通過setCurrency(「USD」),我沒有看到這種行爲。如上所述調用setMaximumFractionDigits()似乎可以解決問題,但對我來說沒有意義,因爲默認情況下,CAD和USD都使用2個小數位。 – gnuf

+0

這隻能解決顯示最大小數位數的問題。其他所有內容(如舍入行爲和貨幣符號位置)都會保留指定區域設置的本地貨幣設置。 – mpontes

5
import java.util.*; 
import java.text.*; 

public class Solution { 

    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 
     double payment = scanner.nextDouble(); 
     scanner.close(); 

     NumberFormat lp; //Local Payment 

     lp = NumberFormat.getCurrencyInstance(Locale.US); 
     System.out.println("US: " + lp.format(payment)); 

     lp = NumberFormat.getCurrencyInstance(new Locale("en", "in")); 
     System.out.println("India: " + lp.format(payment)); 

     lp = NumberFormat.getCurrencyInstance(Locale.CHINA); 
     System.out.println("China: " + lp.format(payment)); 

     lp = NumberFormat.getCurrencyInstance(Locale.FRANCE); 
     System.out.println("France: " + lp.format(payment)); 
    } 
} 
+0

這是一些國家貨幣格式化程序的完整代碼。 – Ankush

1
Scanner scanner = new Scanner(System.in); 
double payment = scanner.nextDouble(); 
scanner.close(); 
java.text.NumberFormat formatUS = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US); 
String us=formatUS.format(payment); 
java.text.NumberFormat formatIn = java.text.NumberFormat.getCurrencyInstance(new java.util.Locale("en","in")); 
String india=formatIn.format(payment); 
java.text.NumberFormat formatChina = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.CHINA); 
String china=formatChina.format(payment); 
java.text.NumberFormat formatFrance = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.FRANCE); 
String france=formatFrance.format(payment); 

System.out.println("US: " + us); 
System.out.println("India: " + india); 
System.out.println("China: " + china); 
System.out.println("France: " + france);