2017-02-07 5 views
1

Bearbeiten: Diese Frage soll für die Formatierung im Kontext von JSR-354 sein. Eine Alternative wäre, java.util.CurrencyFormat zu verwenden. Aber ich möchte wissen, wie es mit MonetaryAmountFormat funktioniert.Wie MonetaryAmount mit Währungssymbol formatieren?

Wie forma Sie ein MonetaryAmount das Währungssymbol im Rahmen der JSR-354 MonetaryAmountFormat mit?

Ich habe versucht, MonetaryAmountFormat zu verwenden, wie unten von zwei verschiedenen Beispielen gezeigt, die ich im Netz fand. Weder Ansatz funktionierte richtig, damit ich meine Beispiel Testfälle github im Fall geschoben würden Sie die vollständigen Details klonen und sehen wollen, aber hier ist der Test:

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

Warum können Sie java.util.CurrencyFormat nicht verwenden? – duffymo

+0

Ich kann, aber diese Frage ist innerhalb der Grenzen von JSR354 und seine Formatierungsfunktionen beabsichtigt. – axiopisty

+0

RTFM. siehe Abschnitt "4.4. Geld- und Währungsformatierungs-API" der endgültigen Spezifikation. Es enthält Codebeispiele. – DwB

Antwort

1

Ich fand die Antwort, nachdem ich die Frage gestellt hatte. Ich habe das Github-Projekt aktualisiert, um die Lösung zu enthalten.

/** 
    * 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); 
    } 
Verwandte Themen