5

如何使用Java获取货币符号? - 申城异乡人

 1 year ago
source link: https://www.cnblogs.com/zwwhnly/p/16972032.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近做了一个支付相关的需求,要求在收银台页面显示商品的价格时带上货币符号¥,类似下图中的格式:

最初我是用的下面这样的代码:

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK