设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

Java 9中新的货币API

2015-1-9 09:00| 发布者: joejoe0332| 查看: 3837| 评论: 0|原作者: Java译站|来自: Java译站

摘要: 此前,Oracle公布Java 9首个增强计划集(众所周知的JEPs)确定会在2016年早些时候发布。而目前,JSR 354定义了一套新的Java货币API,计划会在Java 9中正式引入。JSR 354定义了一套新的Java货币API,计划会在Java 9中 ...


MonetaryFunctions还提供了归约函数,可以用来获取最大值,最小值,以及求和:
  1. List<MonetaryAmount> amounts = new ArrayList<>();  
  2. amounts.add(Money.of(10"EUR"));  
  3. amounts.add(Money.of(7.5"EUR"));  
  4. amounts.add(Money.of(12"EUR"));  
  5.    
  6. Optional<MonetaryAmount> max = amounts.stream().reduce(MonetaryFunctions.max()); // "EUR 7.5"  
  7. Optional<MonetaryAmount> min = amounts.stream().reduce(MonetaryFunctions.min()); // "EUR 12"  
  8. Optional<MonetaryAmount> sum = amounts.stream().reduce(MonetaryFunctions.sum()); //  

自定义的MonetaryAmount操作

MonetaryAmount还提供了一个非常友好的扩展点叫作MonetaryOperator。MonetaryOperator是一个函数式接口,它接收一个MonetaryAmount入参并返回一个新的MonetaryAmount对象。

  1. // A monetary operator that returns 10% of the input MonetaryAmount  
  2. // Implemented using Java 8 Lambdas  
  3. MonetaryOperator tenPercentOperator = (MonetaryAmount amount) -> {  
  4.   BigDecimal baseAmount = amount.getNumber().numberValue(BigDecimal.class);  
  5.   BigDecimal tenPercent = baseAmount.multiply(new BigDecimal("0.1"));  
  6.   return Money.of(tenPercent, amount.getCurrency());  
  7. };  
  8.    
  9. MonetaryAmount dollars = Money.of(12.34567"USD");  
  10.    
  11. // apply tenPercentOperator to MonetaryAmount  
  12. MonetaryAmount tenPercentDollars = dollars.with(tenPercentOperator); // USD 1.234567  

标准的API特性都是通过MonetaryOperator的接口来实现的。比方说,前面看到的舍入操作就是以MonetaryOperator接口的形式来提供的。

汇率

货币兑换率可以通过ExchangeRateProvider来获取。JavaMoney自带了多个不同的ExchangeRateProvider的实现。其中最重要的两个是ECBCurrentRateProvider与 IMFRateProvider。

ECBCurrentRateProvider查询的是欧洲中央银行(European Central Bank,ECB)的数据而IMFRateProvider查询的是国际货币基金组织(International Monetary Fund,IMF)的汇率。

  1. // get the default ExchangeRateProvider (CompoundRateProvider)  
  2. ExchangeRateProvider exchangeRateProvider = MonetaryConversions.getExchangeRateProvider();  
  3.    
  4. // get the names of the default provider chain  
  5. // [IDENT, ECB, IMF, ECB-HIST]  
  6. List<String> defaultProviderChain = MonetaryConversions.getDefaultProviderChain();  
  7.    
  8. // get a specific ExchangeRateProvider (here ECB)  
  9. ExchangeRateProvider ecbExchangeRateProvider = MonetaryConversions.getExchangeRateProvider("ECB");  
如果没有指定ExchangeRateProvider的话返回的就是CompoundRateProvider。CompoundRateProvider会将汇率转换请求委派给一个ExchangeRateProvider链并将第一个返回准确结果的提供商的数据返回。
  1. // get the exchange rate from euro to us dollar  
  2. ExchangeRate rate = exchangeRateProvider.getExchangeRate("EUR""USD");  
  3.    
  4. NumberValue factor = rate.getFactor(); // 1.2537 (at time writing)  
  5. CurrencyUnit baseCurrency = rate.getBaseCurrency(); // EUR  
  6. CurrencyUnit targetCurrency = rate.getCurrency(); // USD  

货币转换

不同货币间的转换可以通过ExchangeRateProvider返回的CurrencyConversions来完成。

  1. // get the CurrencyConversion from the default provider chain  
  2. CurrencyConversion dollarConversion = MonetaryConversions.getConversion("USD");  
  3.    
  4. // get the CurrencyConversion from a specific provider  
  5. CurrencyConversion ecbDollarConversion = ecbExchangeRateProvider.getCurrencyConversion("USD");  
  6.    
  7. MonetaryAmount tenEuro = Money.of(10"EUR");  
  8.    
  9. // convert 10 euro to us dollar   
  10. MonetaryAmount inDollar = tenEuro.with(dollarConversion); // "USD 12.537" (at the time writing)  

请注意CurrencyConversion也实现了MonetaryOperator接口。正如其它操作一样,它也能通过MonetaryAmount.with()方法来调用。

格式化及解析

MonetaryAmount可以通过MonetaryAmountFormat来与字符串进行解析/格式化。

  1. // formatting by locale specific formats  
  2. MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat(Locale.GERMANY);  
  3. MonetaryAmountFormat usFormat = MonetaryFormats.getAmountFormat(Locale.CANADA);  
  4.    
  5. MonetaryAmount amount = Money.of(12345.67"USD");  
  6.    
  7. String usFormatted = usFormat.format(amount); // "USD12,345.67"  
  8. String germanFormatted = germanFormat.format(amount); // 12.345,67 USD  
  9.    
  10. // A MonetaryAmountFormat can also be used to parse MonetaryAmounts from strings  
  11. MonetaryAmount parsed = germanFormat.parse("12,4 USD");  
可以通过AmountFormatQueryBuilder来生成自定义的格式。
  1. // Creating a custom MonetaryAmountFormat  
  2. MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(  
  3.     AmountFormatQueryBuilder.of(Locale.US)  
  4.         .set(CurrencyStyle.NAME)  
  5.         .set("pattern""00,00,00,00.00 ¤")  
  6.         .build());  
  7.    
  8. // results in "00,01,23,45.67 US Dollar"  
  9. String formatted = customFormat.format(amount);  

注意,这里的¤符号在模式串中是作为货币的占位符。

总结

新的货币API这里已经介绍得差不多了。并且目前它的实现也已经相对稳定了(但还需要多补充些文档)。期待能在Java 9中看到这套新的接口!

上述示例可在Github中下载到。

原文出处:Michael Scharhag

译文来自:Java译站


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部