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
*/
}
}
Warum können Sie java.util.CurrencyFormat nicht verwenden? – duffymo
Ich kann, aber diese Frage ist innerhalb der Grenzen von JSR354 und seine Formatierungsfunktionen beabsichtigt. – axiopisty
RTFM. siehe Abschnitt "4.4. Geld- und Währungsformatierungs-API" der endgültigen Spezifikation. Es enthält Codebeispiele. – DwB