使用减号格式化负数美元,而不是括号(Java)

时间:2010-01-13 12:01:16

标签: java currency number-formatting

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

7 个答案:

答案 0 :(得分:36)

它需要对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()可能不会为所有系统返回所有语言环境的值,但它应该适用于主要系统(并且我认为它本身具有合理的回退,因此您不应该做任何事情)

答案 1 :(得分:22)

以下是我总是在java类或fmt:formatNumber jstl标签中使用的结果:

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

尝试:

NumberFormat.getCurrencyInstance(Locale.CANADA);

答案 4 :(得分:0)

NumberFormat.getCurrencyInstance(Locale.UK);

答案 5 :(得分:0)

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

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

查看NumberFormatter的API文档以获取更多详细信息。

答案 6 :(得分:0)

为什么poi拒绝支持Excel货币格式的FIRST选项超出了我! enter image description here

我不喜欢将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!!!");
        }
    }
}