如何使用Java獲取貨幣符號?

2022-12-10 21:00:35

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));

輸出結果:

詳細的各國貨幣程式碼可以檢視以下連結:

貨幣程式碼

ISO 4217