- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在给定 ISO 4217 numeric 货币代码的情况下,我正在尝试使用正确的格式设置规则来设置金额的格式。
例如,给定金额 99.99 和数字代码 840,我希望生成字符串“USD 99.99”或类似字符串。
查看 JSR 354 实现,似乎我需要先找到合适的货币单位。但是,我似乎无法为此目的编写有效的 CurrencyQuery。
给定
CurrencyQuery query = CurrencyQueryBuilder.of().setNumericCodes(840).build();
CurrencyUnit cu = Monetary.getCurrency(query);
MonetaryAmount amount = FastMoney.of(99.99, cu);
System.out.println(MonetaryFormats.getAmountFormat(Locale.ENGLISH).format(amount));
我收到以下异常:
Exception in thread "main" javax.money.MonetaryException: Ambiguous request for CurrencyUnit: CurrencyQuery (
{Query.numericCodes=[840]}), found: [BIF, ARS, DZD, COP, CVE, CHF, HRK, IQD, LAK, XPF, DKK, BAM, ZMK, ITL, XBB, XUA, XPT, BRL, CAD, NZD, SEK, USN, XTS, IEP, SRG, STD, BHD, USS, XAF, AUD, CDF, MTL, QAR, AOA, MGA, TOP, LYD, BOV, ISK, ADP, HTG, IDR, ANG, XXX, BTN, KHR, LTL, KES, INR, MGF, OMR, BEF, EUR, BOB, JPY, XBA, AED, SOS, XPD, SKK, FKP, XBC, CRC, SCR, MYR, MZN, LVL, GYD, XDR, GHS, XCD, MDL, MRO, ZWN, LSL, PEN, ATS, XOF, AZM, BYB, TRY, SRD, TTD, IRR, NOK, BZD, TRL, BDT, KZT, CLF, SLL, USD, ETB, BSD, SDD, UYU, ESP, VEB, TMM, CUP, NAD, DOP, NPR, TJS, VND, ZWR, AMD, FRF, TWD, LUF, GNF, MOP, MKD, JMD, CZK, PTE, LBP, ZWD, RSD, FIM, AZN, SDG, GHC, THB, MMK, BBD, PLN, ROL, NGN, RON, TZS, ERN, GBP, TPE, UZS, XBD, SGD, MXV, SVC, FJD, GWP, CNY, BYR, RUB, CSD, XAG, HKD, BND, SHP, KPW, CLP, KYD, DJF, ILS, RUR, LRD, SYP, SAR, ZWL, VUV, DEM, XSU, SIT, PHP, PYG, TND, HNL, ZAR, XFO, BMD, MWK, ZMW, UGX, NLG, JOD, KWD, YER, GMD, CUC, BGL, RWF, UAH, MVR, AWG, MZM, LKR, CYP, VEF, BWP, MXN, KRW, TMT, GIP, MUR, MNT, EEK, GTQ, PKR, PAB, KGS, GRD, YUM, SZL, GEL, WST, MAD, EGP, SBD, ALL, PGK, NIO, AFA, BGN, XAU, SSP, AFN, HUF, XFU, AYM, KMF]
我应该如何编写货币查询?有没有更好的办法?
测试货币查询.java:
package test;
import java.util.Locale;
import javax.money.CurrencyQuery;
import javax.money.CurrencyQueryBuilder;
import javax.money.CurrencyUnit;
import javax.money.Monetary;
import javax.money.MonetaryAmount;
import javax.money.format.MonetaryFormats;
import org.javamoney.moneta.FastMoney;
public class TestCurrencyQuery {
public static void main(String[] args) {
System.out.println(System.getProperty("java.vm.name"));
System.out.println(System.getProperty("java.version"));
System.out.println(System.getProperty("java.specification.vendor"));
CurrencyQuery query = CurrencyQueryBuilder.of().setNumericCodes(840).build();
CurrencyUnit cu = Monetary.getCurrency(query);
MonetaryAmount amount = FastMoney.of(99.99, cu);
System.out.println(MonetaryFormats.getAmountFormat(Locale.ENGLISH).format(amount));
}
}
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test-jsr354</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.javamoney</groupId>
<artifactId>moneta</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>
控制台输出:
Java HotSpot(TM) 64-Bit Server VM
1.8.0_31
Oracle Corporation
Exception in thread "main" javax.money.MonetaryException: Ambiguous request for CurrencyUnit: CurrencyQuery (
{Query.numericCodes=[840]}), found: [KHR, RON, XTS, FJD, LRD, MVR, BRL, ZMK, PKR, LBP, LYD, SDG, MXV, AED, XDR, STD, CDF, QAR, ISK, SHP, CSD, FRF, BMD, PTE, PLN, XUA, UYU, GYD, LAK, ZAR, ZMW, MKD, XSU, XAF, EEK, ILS, UGX, ITL, XPT, ROL, MUR, INR, TWD, KES, FIM, CHF, HNL, ARS, BGL, KRW, SBD, PHP, RUR, PYG, SRD, AWG, MXN, MGA, SGD, TRL, MZN, SOS, MOP, XBA, IRR, CZK, XFU, TRY, UZS, XFO, TTD, SDD, SCR, COP, ALL, XAU, SYP, USN, PAB, CUC, JMD, GNF, BHD, ANG, IDR, GWP, DEM, SLL, SVC, HRK, NLG, TMT, KZT, MTL, CUP, VEF, ZWN, NOK, LVL, CLF, TMM, BEF, VEB, MZM, DOP, GHS, BBD, XPF, CYP, UAH, BAM, TPE, BND, BYB, MGF, SIT, BWP, XBD, XCD, LSL, AYM, RUB, ADP, SEK, YUM, AOA, WST, GBP, ZWD, THB, ZWL, ESP, MAD, USS, ETB, NGN, AUD, TZS, XAG, VND, BTN, JOD, PGK, XBB, DKK, VUV, BYR, NZD, EGP, SSP, KMF, CNY, MWK, AZM, SAR, CVE, HUF, HTG, SRG, AZN, GIP, LUF, DJF, GEL, RWF, TJS, TOP, TND, ERN, OMR, GRD, MMK, LKR, FKP, NIO, ATS, KPW, PEN, AMD, IEP, BZD, XXX, BIF, GTQ, KYD, EUR, LTL, CRC, HKD, BGN, RSD, SZL, USD, KWD, CLP, MYR, BOB, AFA, GHC, JPY, AFN, GMD, MDL, IQD, BSD, MNT, NPR, MRO, XPD, DZD, NAD, CAD, BOV, KGS, ZWR, SKK, XOF, YER, BDT, XBC]
at javax.money.spi.MonetaryCurrenciesSingletonSpi.getCurrency(MonetaryCurrenciesSingletonSpi.java:173)
at javax.money.Monetary.getCurrency(Monetary.java:506)
at test.TestCurrencyQuery.main(TestCurrencyQuery.java:21)
最佳答案
根据 moneta 的注释, 货币只能通过货币代码或区域设置访问。此实现不提供通过数字代码访问。以下是您通过货币代码 USD 访问的方式:
CurrencyQuery query = CurrencyQueryBuilder.of().setCurrencyCodes("USD").build();
CurrencyUnit cu = Monetary.getCurrency(query);
MonetaryAmount amount = FastMoney.of(99.99, cu);
System.out.println(MonetaryFormats.getAmountFormat(Locale.ENGLISH).format(amount));
如果您想贡献一个基于数字代码的查询,我建议您联系项目本身。
或者,您可以使用 getCurrencies()
检索所有货币并根据数字代码进行过滤:
CurrencyUnit cu = Monetary.getCurrencies().stream()
.filter(c -> c.getNumericCode() == 840)
.findAny()
.orElseThrow(RuntimeException::new);
最后,您可以 implement your own CurrencyProvider实现 getCurrency 以根据数字代码进行搜索。
关于java - 从 ISO **数字** 货币代码中查找 CurrencyUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44133574/
我想知道是否可以通过 ISO 8583 做一个完整的声明(在一个日期范围之间),我看到 ATM 可以做完整的声明并且想知道他们使用什么方法。我知道余额查询和迷你报表可以在超过 8583 的 POS 设
我一直在尝试通过 7zip 和 WinRar 提取 ISO 镜像。 这是我使用的命令行: 7z x -y "%Isocontents%\ISO.iso" -o%Newfolder% WinRar.ex
我正在将 ICU 集成到一些内部软件中。我希望能够获取诸如“en_US”之类的字符串并为其获取脚本名称“Latin”。 (虽然最终我实际上想要一个 ICU ScriptCode。) 我尝试使用 ICU
我的数据位于一个数据框中,其结构如下: df2 <- data.frame(Year = c("2007"), Week = c(1:12), Measurement = c(rnorm(12, me
我需要计算一周分配到的年份。例如,2003 年 12 月 29 日被指定为 2004 年的第一周(我认为这仅适用于欧洲)。您可以使用以下代码来查看: SELECT DATEPART(isowk, '2
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我有一个文件。在 Python 中,我想占用它的创建时间,并将其转换为 ISO time (ISO 8601) string 同时保留它是在 Eastern Time Zone 中创建的事实。 (美国
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我在二维网格上有两个标量场。我想为第一个标量场绘制一条等值线,并根据第二个标量场设置其不透明度。 我从 this SO answer 开始尝试使用 mayavi但我无法从 3D 切换到 2D。 下面是
假设您声明两个同构 showing :: (Read a, Show a) => Iso' String a showing = iso read show reading :: (Read a, S
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines准则。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
假设有一个两个字符的String,它应该代表ISO 639国家或语言名称。 你知道,Locale类有两个函数 getISOLanguages和 getISOCountries分别返回包含所有 ISO
实体中的值是否可以自由嵌入到 ISO 10303-21 格式的文件中? 在我看到的所有由 CAD 程序生成的示例中,length_measure 都嵌入在uncertainty_measure_wit
是否可以从原始 ISO 自动创建用于操作系统安装的 Vagrant .box 文件? 对我来说,Vagrant 提供的虚拟机上操作系统安装和配置的端到端自动化存在巨大差距。 当然,VagrantBox
有没有办法实现这样的格式: 2003-09-25T14:00:00.000+1000 or 2003-09-25T14:00:00.000+1100 要这样转换 2003-09-25T14:00:00
我正在使用: @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @JsonFormat( pattern = "MM-dd-yyyy" ) private
我需要将 iso-3166-1/iso-3166-2 代码转换为经度/纬度 例子: 输入:“美国”,输出:(37.09024, -95.71289100000001)。 输入“VE-O”,输出:(10
我想转换 POSIX 语言环境名称,例如 en_US、de_DEISO-639-1 和 ISO-3166 代码到 Windows English_United States、German_German
我在 MS Access 上有一个数据库,我通过调用 PDO 和 odbc 驱动程序将其与 PHP 一起使用。我的数据库中有法语、丹麦语和波兰语单词。法语和丹麦语没问题,但波兰语字符没办法,我只得到“
我是一名优秀的程序员,十分优秀!