最近做了一個支付相關的需求,要求在收銀臺頁面顯示商品的價格時帶上貨幣符號¥,類似下圖中的格式:
最初我是用的下面這樣的程式碼:
System.out.println(Currency.getInstance(Locale.CHINA).getSymbol());
本機測試,正常返回¥,如下圖所示:
但部署到伺服器後,發現伺服器返回的是CNY,而不是預期的¥。
於是將上面的程式碼改成了下面這樣:
System.out.println(Currency.getInstance("CNY").getSymbol(Locale.CHINA));
本機測試,返回¥,部署到伺服器後,也返回¥。
為什麼Currency.getInstance(Locale.CHINA).getSymbol()
在本機返回¥,而在伺服器返回CNY呢?
帶著這個疑問,看了下getSymbol()
方法的原始碼,發現其內部有獲取預設區域設定的邏輯:
因為我本機是簡體中文環境,所以獲取到的預設區域設定是zh_CN:
System.out.println(Locale.getDefault());
這個和傳入的Locale.CHINA
是一致的:
因此在本機傳不傳Locale.CHINA
,都能正常返回¥。
而伺服器上Locale.getDefault()
返回的是en_US,因此Currency.getInstance(Locale.CHINA).getSymbol()
在伺服器返回CNY,而指定了區域的話,Currency.getInstance("CNY").getSymbol(Locale.CHINA)
就返回¥。
可以使用Locale.setDefault(Locale.US);
修改預設的區域設定,這個將會影響程式的輸出結果:
System.out.println(Locale.getDefault());
Locale.setDefault(Locale.US);
System.out.println(Currency.getInstance(Locale.CHINA).getSymbol());
System.out.println(Currency.getInstance("CNY").getSymbol());
System.out.println(Currency.getInstance("CNY").getSymbol(Locale.CHINA));
System.out.println(Currency.getInstance("USD").getSymbol());
System.out.println(Currency.getInstance("USD").getSymbol(Locale.US));
System.out.println(Locale.getDefault());
輸出結果如下圖所示:
從輸出結果可以看出,剛開始的預設區域設定是zh_CN,執行Locale.setDefault(Locale.US);
修改預設區域設定後,下面的程式碼原本在本機是返回¥的,現在卻返回了CNY:
System.out.println(Currency.getInstance(Locale.CHINA).getSymbol());
System.out.println(Currency.getInstance("CNY").getSymbol());
但如果指定了區域設定的話System.out.println(Currency.getInstance("CNY").getSymbol(Locale.CHINA));
,會正常返回¥。
因為修改了預設的區域設定為Locale.US
,因此不管指不指定區域設定,以下程式碼都返回$:
System.out.println(Currency.getInstance("USD").getSymbol());
System.out.println(Currency.getInstance("USD").getSymbol(Locale.US));
因為此時獲取到的預設區域設定en_US和指定的Locale.US
是一致的:
綜上所述:獲取貨幣符號時,如果不想本機和伺服器返回值不一致,要使用指定區域設定的getSymbol(Locale locale)方法,不要使用getSymbol()方法。
推薦用法:
System.out.println(Currency.getInstance("CNY").getSymbol(Locale.CHINA));
System.out.println(Currency.getInstance("USD").getSymbol(Locale.US));
上面提到的CNY、USD是貨幣程式碼,¥、$是其對應的貨幣符號,下面列舉幾個常用的貨幣程式碼及其對應的貨幣符號:
國家/地區/組織 | 貨幣名稱 | 貨幣程式碼 | 貨幣符號 |
---|---|---|---|
中國 | 人民幣 | CNY | ¥ |
美國 | 美元 | USD | $ |
英國 | 英鎊 | GBP | £ |
使用java程式碼獲取方式:
System.out.println("人民幣:" + Currency.getInstance("CNY").getSymbol(Locale.CHINA));
System.out.println("美元:" + Currency.getInstance("USD").getSymbol(Locale.US));
System.out.println("英鎊:" + Currency.getInstance("GBP").getSymbol(Locale.UK));
輸出結果:
詳細的各國貨幣程式碼可以檢視以下連結: