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

如何使用Java获取货币符号?的更多相关文章

  1. 【java 获取数据库信息】获取MySQL或其他数据库的详细信息

    1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...

  2. Java获取函数参数名称

    原理 编译之后的class文件默认是不带有参数名称信息的,使用 IDE 时,反编译jar包得到的源代码函数参数名称是 arg0,arg1......这种形式,这是因为编译 jar 包的时候没有把符号表 ...

  3. java获取本地计算机MAC地址

    java获取本地计算机MAC地址代码如下: public class SocketMac { //将读取的计算机MAC地址字节转化为字符串 public static String transByte ...

  4. java获取https网站证书,附带调用https:webservice接口

    一.java 获取https网站证书: 1.创建一个java工程,新建InstallCert类,将以下代码复制进去 package com; import java.io.BufferedReader ...

  5. java获取图片原始尺寸

    java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...

  6. java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)

    一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start= ...

  7. Java获取Web服务器文件

    Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...

  8. java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...

  9. spring java 获取webapp下文件路径

    spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...

  10. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

随机推荐

  1. 通过使用nginx来实现logstash的负载均衡

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106813223 总结: nginx配置,192.168.0.5 user nginx ...

  2. @property装饰器和property()函数

    @property装饰器 Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式. class Peopl ...

  3. Jpa常用API

    service中执行sql 根据请求参数拼接sql import javax.persistence.Query; import javax.persistence.EntityManager; @A ...

  4. frp服务利用云主机实现Windows远程连接

    frp服务利用云主机实现Windows远程连接 1.下载所需要的安装包 https://github.com/fatedier/frp/releases 下载 frp_0.44.0_linux_amd ...

  5. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  6. 带你读AI论文丨ACGAN-动漫头像生成

    摘要:ACGAN-动漫头像生成是一个十分优秀的开源项目. 本文分享自华为云社区<[云驻共创]AI论文精读会:ACGAN-动漫头像生成>,作者:SpiderMan. 1.论文及算法介绍 1. ...

  7. MYSQL-->InnoDB引擎底层原理

    逻辑存储结构 逻辑存储结构图 表空间 表空间文件在Linux下存放在 /var/lib/mysql文件中的 xxx.ibd 文件就是表空间文件 表空间文件用来存储,记录,索引等数据. 段 段分为,数据 ...

  8. Hive之安装

    Hive安装 1. 依赖hadoop(另有hadoop安装文档) 执行程序运行在yarn上面,需要启动start-yarn.sh 2. 先安装MySQL MySQL安装详见数据库MySQL之安装:ht ...

  9. 彻底学会Selenium元素定位

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/63099961.html 你好,我是测试蔡坨坨. 最近收到不少初学UI自动化测试的小伙伴私信,对于元素的定位还是有些头疼,总 ...

  10. C# String.IsNullOrEmpty()方法的使用

    IsNullOrEmpty(string)是String类的一个有参的方法,方法需要类的调用,所以String.IsNullOrEmpty(string) IsNullOrEmpty是判断字符串的Nu ...