一、概述
JSR 354 - “金钱和货币”解决了Java中货币和货币金额的标准化问题。
它的目标是为Java生态系统添加一个灵活的可扩展的API,并使货币量更简单,更安全。
JSR没有进入JDK 9,而是未来JDK版本的候选人。虽然在Java9有Currency类简单实现但是实际开发中满足不了需求
二、引入
在maven的pom.xml中做如下引入
org.javamoney
moneta
最新版本
在gradle中
compile group: 'org.javamoney', name: 'moneta', version: '最新版本'
最新版本依赖,可以查看,点击这里
三、JSR-354功能
“货币和金钱”API的目标:
1.提供处理和计算货币金额的API
2.定义货币和货币金额的类别,以及货币四舍五入
3.处理汇率
4.处理货币和货币金额的格式化和解析
四、API分析与使用
1.规范中提到的类及接口都在javax.money.*包下面。
2.先从核心的两个接口CurrencyUnit与MonetaryAmount开始剖析
3.CurrencyUnit及MonetaryAmount
CurrencyUnit
代表的是货币。它有点类似于现在的java.util.Currency类,不同之处在于它支持自定义的实现。从规范的定义来看,java.util.Currency也是可以实现该接口的。CurrencyUnit的实例可以通过Monetary.getCurrency()方法获取,如下:
//据货币代码来获取货币单位
CurrencyUnit currencyUnit = Monetary.getCurrency("USD");
//亦或根据国家及地区来获取货币单位
CurrencyUnit unit = Monetary.getCurrency(Locale.US);
CurrencyUnit模拟货币的最小属性,我们使用货币的字符串表示形式创建CurrencyUnit ,这可能会导致我们尝试使用不存在的代码创建货币的情况。使用不存在的代码创建货币会引发UnknownCurrency异常。
MonetaryAmount
MonetaryAmount是货币金额的数字表示。它始终与CurrencyUnit 关联,并定义货币的货币表示形式。
金额可以用不同的方式来实现,重点放在由每个具体用例所定义的货币表示要求的行为上。例如。Money和FastMoney是MonetaryAmount接口的实现。
FastMoney实现MonetaryAmount使用长为数字表示,并且比更快的BigDecimal在精度的成本; 它可以在我们需要性能时使用,精度不是问题。
Money与FastMoney是JavaMoney库中MonetaryAmount的两种实现。Money是默认实现,它使用BigDecimal来存储金额。FastMoney是可选的另一个实现,它用long类型来存储金额。根据文档来看,FastMoney上的操作要比Money的快10到15倍左右。然而,FastMoney的金额大小与精度都受限于long类型。
注意:这里的Money和FastMoney都是具体的实现类(它们在org.javamoney.moneta.包下面,而不是javax.money.)。如果你不希望指定具体类型的话,可以通过MonetaryAmountFactory来生成一个MonetaryAmount的实例
通用实例可以使用默认工厂创建。
e.g:
CurrencyUnit currencyUnit =