【问题标题】:NumberFormat vs Joda moneyNumberFormat vs 乔达钱
【发布时间】:2015-01-15 07:35:18
【问题描述】:

我需要使用基于货币代码的符号和格式显示货币金额。目前,我为每个货币代码使用默认语言环境,因为我无法访问确切的语言环境以及货币代码,并使用NumberFormat.format() 来获取带有格式和符号的格式化货币金额。 Jodamoney 是否做到了这一切 - 提供货币代码并显示带符号的格式化货币?对此的任何帮助/指导表示赞赏。

【问题讨论】:

    标签: java format currency joda-money


    【解决方案1】:

    我刚刚发现了 joda-money,我正在对其进行测试,看看它是否符合我的项目要求。我阅读了您的问题并决定在测试库时回答它。

    对于我在 joda-money jar 中看到的内容,它只有很少的类,并提供基本的货币管理和格式化程序。

    似乎在 joda-money 是格式化程序的早期阶段仍然需要 Locale 来打印货币符号,正如您在我的代码中看到的那样。 (代码在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
    

    如您所见,需要使用语言环境来打印“$”符号。

    另外我尝试了另一种货币,日元(日本货币)。我用美国语言环境打印它,结果是我没有指定的。

    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
    

    编辑: 您还可以创建一个抽象类作为 Money 的包装器,如下所示:

    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)
    

    【讨论】:

      【解决方案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 来实现,而无需手动维护 3 个字符货币代码中的每一个的默认区域设置(语言、国家/地区)。
      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 2013-03-18
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多