如何使用Java获取货币符号?
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));
输出结果:
详细的各国货币代码可以查看以下链接:
如何使用Java获取货币符号?的更多相关文章
- 【java 获取数据库信息】获取MySQL或其他数据库的详细信息
1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...
- Java获取函数参数名称
原理 编译之后的class文件默认是不带有参数名称信息的,使用 IDE 时,反编译jar包得到的源代码函数参数名称是 arg0,arg1......这种形式,这是因为编译 jar 包的时候没有把符号表 ...
- java获取本地计算机MAC地址
java获取本地计算机MAC地址代码如下: public class SocketMac { //将读取的计算机MAC地址字节转化为字符串 public static String transByte ...
- java获取https网站证书,附带调用https:webservice接口
一.java 获取https网站证书: 1.创建一个java工程,新建InstallCert类,将以下代码复制进去 package com; import java.io.BufferedReader ...
- java获取图片原始尺寸
java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...
- java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)
一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start= ...
- Java获取Web服务器文件
Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...
- java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换
java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...
- spring java 获取webapp下文件路径
spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
随机推荐
- 使用python读取京东pdf发票信息导出到excel表格中
代码 #!/usr/bin/env python # -*- coding: utf-8 -*- """ pip install pdfminer3k pip insta ...
- C#-01 关于C#中传入参数的一些用法
实验环境 实验所处环境位于vs2019环境中 学习内容 一.最基础的参数传入:值参数 对于这种传入,和其他的c,c++编程语言参数传入一样,没有太大差别,在这里给如下例子: 虽然这里并没有进行传参但是 ...
- Codeforces Round #708 (Div. 2)
A题被hack,A题很简单,其实题目没看懂,直接看样例做的. B题题意是以为懂了,但是样例一直看不懂. 经验:要两两相加能被一个m整除数组sum最少,利用他们的余数就可以设为a[x], x是余数,如果 ...
- Tableau Server 常用命令
Tableau Server 常用命令 1> 停止tableau server服务 tabadmin stop 2> 恢复tableau server数据 tabadmin restore ...
- Java学生管理系统(详解)
相信大部分人都有接触过这个 Java 小项目--学生管理系统,下面会分享我在做这个项目时的一些方法以及程序代码供大家参考(最后附上完整的项目代码). 首本人只是个初学Java的小白,可能项目中有许多地 ...
- 知识图谱-生物信息学-医学论文(Chip-2022)-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用
16.(2022)Chip-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用 论文标题: Construction and Application of Chinese Breast Cance ...
- 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-MSTE: 基于多向语义关系的有效KGE用于多药副作用预测
MSTE: 基于多向语义关系的有效KGE用于多药副作用预测 论文标题: Effective knowledge graph embeddings based on multidirectional s ...
- Conda的使用
conda常用的命令 在Anaconda Powershell Prompt 输入: 1.conda -V检验是否安装及当前conda的版本. 2.conda list查看安装了哪些包 3.conda ...
- 一篇文章带你了解NoSql数据库——Redis简单入门
一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...
- RegExp正则表达式的匹配
JavaScript RegExp 对象 RegExp 对象 正则表达式是描述字符模式的对象. 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具. 语法 var patt=n ...