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); 
    } 
Смежные вопросы