2017-02-07 3 views
1

편집 :이 질문은 JSR-354의 컨텍스트 내에서 형식을 지정하기위한 것입니다. 대안은 java.util.CurrencyFormat을 사용하는 것입니다. 하지만 MonetaryAmountFormat을 사용하여 어떻게하는지 알고 싶습니다.MonetaryAmount를 통화 기호로 포맷하는 방법은 무엇입니까?

MonetaryAmount은 JSR-354 MonetaryAmountFormat의 컨텍스트 내에서 통화 기호를 사용하여 어떻게 포맷합니까?

내가 웹에서 찾은 두 가지 다른 예에서 아래에 설명 된대로 MonetaryAmountFormat을 사용하려고했습니다. 어느 접근 방식은 당신이 복제하고 자세한 내용을보고 싶은 경우에 github 내 예를 들어, 테스트 케이스를 밀어 수 있도록 제대로 작동하지만, 여기에 테스트입니다 :

의 pom.xml :

<dependency> 
    <groupId>org.javamoney</groupId> 
    <artifactId>moneta</artifactId> 
    <version>1.1</version> 
</dependency> 

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
    <scope>test</scope> 
</dependency> 

TestMonetaryAmountFormat.java

package com.github.axiopisty.stackoverflow.jsr354; 

import java.math.BigDecimal; 
import java.text.DecimalFormatSymbols; 
import java.util.Locale; 
import javax.money.CurrencyUnit; 
import javax.money.Monetary; 
import javax.money.MonetaryAmount; 
import javax.money.format.AmountFormatQueryBuilder; 
import javax.money.format.MonetaryAmountFormat; 
import javax.money.format.MonetaryFormats; 
import org.javamoney.moneta.Money; 
import org.junit.Test; 

import static org.junit.Assert.assertEquals; 

public class TestMonetaryAmountFormat { 

    private final String EXPECTED = "$12.99"; 

    private final CurrencyUnit USD = Monetary.getCurrency("USD"); 
    private final MonetaryAmount AMOUNT = Money.of(new BigDecimal("12.99"), USD); 

    /** 
    * See: http://www.programcreek.com/java-api-examples/index.php?api=javax.money.format.MonetaryAmountFormat 
    */ 
    @Test 
    public void testFormatWithCurrencySymbol_1() { 
    MonetaryAmountFormat maf = MonetaryFormats.getAmountFormat(
     AmountFormatQueryBuilder 
     .of(Locale.US) 
     .setFormatName("SYMBOL") 
     .build() 
    ); 
    String actual = maf.format(AMOUNT); 
    assertEquals(EXPECTED, actual); 
    /** 
    * The previous assert statement results in the following: 
    * 
    * javax.money.MonetaryException: No MonetaryAmountFormat for AmountFormatQuery AmountFormatQuery (
    * {Query.formatName=SYMBOL, java.util.Locale=en_US}) 
    * at javax.money.spi.MonetaryFormatsSingletonSpi.getAmountFormat(MonetaryFormatsSingletonSpi.java:71) 
    * at javax.money.format.MonetaryFormats.getAmountFormat(MonetaryFormats.java:110) 
    * at com.github.axiopisty.stackoverflow.jsr354.TestMonetaryAmountFormat.testFormatWithCurrencySymbol_1(TestMonetaryAmountFormat.java:26) 
    * ... 
    **/ 
    } 

    /** 
    * See: https://github.com/JavaMoney/javamoney-examples/issues/25 
    */ 
    @Test 
    public void testFormatWithCurrencySymbol_2() { 
    DecimalFormatSymbols symbols = new DecimalFormatSymbols(); 
    MonetaryAmountFormat maf = MonetaryFormats.getAmountFormat(
     AmountFormatQueryBuilder 
     .of(Locale.US) 
     .set(symbols) 
     .build() 
    ); 
    String actual = maf.format(AMOUNT); 

    assertEquals(EXPECTED, actual); 
    /** 
    * The previous assert statement results in the following: 
    * 
    * org.junit.ComparisonFailure: 
    * Expected :$12.99 
    * Actual :USD12.99 
    */ 
    } 

} 
+0

왜 java.util.CurrencyFormat을 사용할 수 없습니까? – duffymo

+0

이 질문은 JSR354의 범위 내에서 의도되었으며 형식 지정 기능입니다. – axiopisty

+0

RTFM. 최종 스펙의 "4.4. 화폐와 화폐 포맷 API"섹션을 참조하십시오. 코드 예제가 포함되어 있습니다. – DwB

답변

1

질문을 한 직후 답을 찾았습니다. 솔루션을 포함하도록 github 프로젝트를 업데이트했습니다.

/** 
    * See http://stackoverflow.com/q/40244526/328275 
    */ 
    @Test 
    public void test3() { 
    final MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
     AmountFormatQueryBuilder.of(Locale.US) 
     .set(CurrencyStyle.SYMBOL) 
     .build() 
    ); 
    final String actual = format.format(AMOUNT); 
    assertEquals(EXPECTED, actual); 
    }