【问题标题】:How to format MonetaryAmount with currency symbol?如何使用货币符号格式化 MonetaryAmount?
【发布时间】:2017-02-08 03:48:21
【问题描述】:

编辑: 这个问题旨在用于在 JSR-354 的上下文中进行格式化。另一种方法是使用java.util.CurrencyFormat。但我想知道如何使用MonetaryAmountFormat

如何在 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
     */
  }

}

【问题讨论】:

  • 为什么不能使用 java.util.CurrencyFormat?
  • 我可以,但是这个问题是在 JSR354 的范围内,它的格式化功能。
  • RTFM。请参阅最终规范的“4.4. Money and Currency Formatting API”部分。它包括代码示例。

标签: java jsr354


【解决方案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);
  }

【讨论】:

  • 如何只获取符号?
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多