2017-02-07 17 views
1

編輯:此問題旨在用於在JSR-354的上下文中進行格式化。另一種方法是使用java.util.CurrencyFormat。但我想知道如何使用MonetaryAmountFormat來做到這一點。如何使用貨幣符號格式化MonetaryAmount?

如何在JSR-354 MonetaryAmountFormat的上下文中使用貨幣符號格式化MonetaryAmount

我嘗試使用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); 
    }