1. 前言 最近做了一個支付相關的需求,要求在收銀台頁面顯示商品的價格時帶上貨幣符號¥,類似下圖中的格式: 最初我是用的下麵這樣的代碼: System.out.println(Currency.getInstance(Locale.CHINA).getSymbol()); 本機測試,正常返回¥,如下 ...
1. 前言
最近做了一個支付相關的需求,要求在收銀台頁面顯示商品的價格時帶上貨幣符號¥,類似下圖中的格式:
最初我是用的下麵這樣的代碼:
System.out.println(Currency.getInstance(Locale.CHINA).getSymbol());
本機測試,正常返回¥,如下圖所示:
但部署到伺服器後,發現伺服器返回的是CNY,而不是預期的¥。
於是將上面的代碼改成了下麵這樣:
System.out.println(Currency.getInstance("CNY").getSymbol(Locale.CHINA));
本機測試,返回¥,部署到伺服器後,也返回¥。
2. 原因分析
為什麼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));
3. 拓展知識
上面提到的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));
輸出結果:
詳細的各國貨幣代碼可以查看以下鏈接: