【问题标题】:Format negative amount of USD with a minus sign, not brackets (Java)用减号而不是括号格式化美元的负数(Java)
【发布时间】:2011-01-04 14:40:48
【问题描述】:

如何让NumberFormat.getCurrencyInstance() 打印带有减号的负美元货币值?

【问题讨论】:

    标签: java currency number-formatting


    【解决方案1】:

    它需要对 NumberFormat.getCurrencyInstance() 返回的 DecimalFormat 进行一些调整,以便以独立于语言环境的方式进行。这是我所做的(在 Android 上测试):

    DecimalFormat formatter = (DecimalFormat)NumberFormat.getCurrencyInstance();
    String symbol = formatter.getCurrency().getSymbol();
    formatter.setNegativePrefix(symbol+"-"); // or "-"+symbol if that's what you need
    formatter.setNegativeSuffix("");
    

    IIRC, Currency.getSymbol() 可能不会为所有系统的所有语言环境返回一个值,但它应该适用于主要系统(我认为它本身有一个合理的回退,所以你不应该做任何事情)

    【讨论】:

      【解决方案2】:

      这是我总是在 java 类中或通过 fmt:formatNumber jstl 标记使用的一个:

      DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
      String formatted = format.format(15.5);
      

      它总是产生至少 $0.00 并且在显示时是一致的。还包括数千个需要的分隔符。如果这是您的要求,您可以将减号移到美元符号前面。

      【讨论】:

        【解决方案3】:

        如果您想要特定格式而不是依赖默认格式,最好创建自己的 DecimalFormat

        编辑:您也可以将 NumberFormat.getCurrencyInstance() 的结果转换为 DecimalFormat 并根据您的喜好进行调整。

        【讨论】:

        • 也许你是对的,但我的应用程序应该能够在可能的语言环境中格式化货币。为所有这些语言环境实施格式化会不会太难?
        【解决方案4】:

        试试:

        NumberFormat.getCurrencyInstance(Locale.CANADA);

        【讨论】:

          【解决方案5】:
          NumberFormat.getCurrencyInstance(Locale.UK);
          

          【讨论】:

            【解决方案6】:

            为什么 poi 拒绝在 excel 货币格式中支持 FIRST 选项,这超出了我的理解!

            我不喜欢使用 DecimalFormat 表示货币,因为您的最终单元格值在引入货币符号后变为非数字。在为一家大型金融机构工作时,我的任务是解决此格式问题。这个变化的核心思想是,因为 POI 拒绝合理并且对 Excel 的原生选项有全面的支持,我会渗透到他们的代码中,并在核心上改变他们的价值观。以下是我的解决方法:

            private static final String CURRENCY_FORMAT_OVERRIDE = "\"$\"#,##0.00_);-\"$\"#,##0.00";
            private static final String CURRENCY_FORMAT_TARGET = "\"$\"#,##0.00_);(\"$\"#,##0.00)";    
            
            static { // static class level initializer
                Field field = org.apache.poi.ss.usermodel.BuiltinFormats.class.getDeclaredField("_formats");            
                field.setAccessible(true);
                String[] _formats = (String[])field.get(new org.apache.poi.ss.usermodel.BuiltinFormats());
                for(int i = 0; i < _formats.length; ++i) {
                    if(_formats[i].equals(CURRENCY_FORMAT_TARGET)) {
                        _formats[i]=CURRENCY_FORMAT_OVERRIDE;
                        System.out.println("TAKE THAT, POI!!!");
                    }
                }
            }
            

            【讨论】:

              【解决方案7】:

              由于我再次遇到这个问题,我做了一些研究,发现ICU提供的更具弹性的解决方案:

              NumberFormatter
                .withLocale(...)
                .unit(Currency.getInstance("USD"))
                .sign(SignDisplay.AUTO) // "123", "0", and "-123"
                .format(123)
                .toString();
              

              查看NumberFormatter的API文档了解更多详情。

              【讨论】:

              • 当我点击上面的 NumberFormatter 链接时遇到安全风险。
              • 谢谢,已修复!文档已迁移。对于后代,如果这种情况再次发生:google.com/search?q=icu+numberformatter
              猜你喜欢
              • 2013-11-04
              • 2022-11-10
              • 1970-01-01
              • 2014-10-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多