NumberFormat против Йода деньги

Мне нужно отобразить сумму валюты с символом и формат на основе кода валюты. В настоящее время я использую язык по умолчанию для каждого кода валюты, так как у меня нет доступа к точному языку вместе с кодом валюты и использую NumberFormat.format() получить отформатированную сумму валюты с форматом и символом. Есть ли Joda деньги делают все это - укажите код валюты, и она отображает отформатированную валюту с символом? Любая помощь / направление в этом отношении приветствуется.

2 ответа

Решение
 public static void main(String[] args) throws Exception {

        Currency usd = java.util.Currency.getInstance("USD");
        NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US);
        format.setCurrency(usd);
        System.out.println(format.format(23232312));
    }

Выход

$23,232,312.00

Я только что узнал о joda-money, я тестирую их, чтобы убедиться, что они соответствуют требованиям моего проекта. Я прочитал ваш вопрос и решил ответить на него во время тестирования библиотеки.

Для того, что я мог видеть в банке joda-money, у него очень мало классов, и он обеспечивает базовое управление валютой и форматирование.

Похоже, что на ранней стадии, когда joda-money является средством форматирования, все еще требуется Locale для печати символа money, как вы можете видеть в моем коде. (Код написан на языке scala, но вызов методов в Java одинаков)

import org.joda.money.format.MoneyFormatterBuilder
import org.joda.money.{Money, CurrencyUnit}

def formatterBuilder() = new MoneyFormatterBuilder().appendCurrencySymbolLocalized().appendAmount()

def moneyFormatter(locale: java.util.Locale) = formatterBuilder().toFormatter(locale)

def moneyFormatter() = formatterBuilder().toFormatter

val usd: CurrencyUnit = CurrencyUnit.of("USD")
val money = Money.of(usd, 23232312d)                  // or just Money.parse("USD 23232312")

moneyFormatter().print(money)                         // res0: String = USD23,232,312.00
moneyFormatter(java.util.Locale.US).print(money)      // res1: String = $23,232,312.00

Как видите, Locale необходим для печати символа '$'.

Кроме того, я попробовал с другой валютой, иеной (валютой Японии). Я напечатал это с американским языком, и результат был чем-то, что я не специфицировал.

val japan = Money.parse("JPY 23232312")

moneyFormatter().print(japan)                         // res2: String = JPY23,232,312
moneyFormatter(java.util.Locale.JAPAN).print(japan)   // res3: String = ¥23,232,312
moneyFormatter(java.util.Locale.US).print(japan)      // res4: String = JPY23,232,312

РЕДАКТИРОВАТЬ: Вы также можете создать абстрактный класс в качестве оболочки для денег, как это:

abstract class Currency(amount: BigDecimal, locale: java.util.Locale) {
  val currencyUnit: CurrencyUnit = CurrencyUnit.getInstance(locale)
  val money: Money = Money.of(currencyUnit, amount)
  def formatted: String = new MoneyFormatterBuilder().appendCurrencySymbolLocalized().appendAmount().toFormatter(locale).print(money)
  // implement others Money methods
}

class USDollars(amount: BigDecimal) extends Currency(amount, java.util.Locale.US)
Другие вопросы по тегам