2017-05-23 6 views
2

ISO 4217 숫자 통화 코드를 사용하여 올바른 형식 지정 규칙을 사용하여 금액을 형식화하려고합니다.통화 단위 찾기 ISO ** 숫자 ** 통화 코드

예를 들어 99.99와 숫자 코드 840이 주어지면 'USD 99.99'또는 이와 유사한 문자열을 생성 할 것으로 예상됩니다.

JSR 354 구현을 살펴보면 먼저 적절한 통화 단위를 찾아야합니다. 그러나, 나는이 목적을 위해 유효한 CurrencyQuery를 작성하는 것 같지 않습니다.

가 가
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] 

가 어떻게 통화 조회를 구성해야 :

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)); 

나는 다음과 같은 예외가 발생

을 감안할 때? 더 좋은 방법이 있습니까?

TestCurrencyQuery.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) 
+0

사용중인 설정 파일 (maven, gradle)/jar를 공유 할 수 있습니까? –

+0

세부 정보가 편집 된 질문이 있습니다. –

답변

0

이미 언급했듯이이 구현을 사용하여 통화 코드를 통해 CurrencyUnit에 액세스 할 수 없습니다. 작업에서 매개 변수로 통화 코드를 엄격하게 수락하는 경우 자체 매핑을 만들 수 있습니다. 더 나은 접근 방법은 숫자 코드와 통화 코드 간의 매핑을 저장할 수있는 데이터베이스를 사용하는 것입니다.

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().setCurrencyCodes(getCurrencyCodesFromNumeric(840)).build(); 
    CurrencyUnit cu = Monetary.getCurrency(query); 
    MonetaryAmount amount = FastMoney.of(99.99, cu); 
    System.out.println(MonetaryFormats.getAmountFormat(Locale.ENGLISH).format(amount)); 
    } 

    public String[] getCurrencyCodesFromNumeric(int... codes) { 
     Collection<String> currencyCodes = // query db and return associated String currency codes; 
     return currencyCodes.toArray(new String[currencyCodes.size()]); 
    } 
} 
1

PE r 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); 

마지막으로, 숫자 코드를 기반으로 검색 할 수 getCurrency를 구현 implement your own CurrencyProvider 수 있었다.

+0

감사하지만, 좋은 지적입니다. 나는 지원을 추가하는 아이디어가 마음에 든다. –

+0

@ andrew-g-za 숫자 코드를 기반으로 통화에 액세스 할 수있는 몇 가지 옵션을 추가했습니다. –