31

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

4

7 回答 7

43

它需要对返回的 DecimalFormat 进行一些调整,NumberFormat.getCurrencyInstance()以便以与语言环境无关的方式进行操作。这是我所做的(在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()可能不会为所有系统的所有语言环境返回一个值,但它应该适用于主要系统(我认为它本身有一个合理的回退,所以你不应该做任何事情)

于 2010-10-12T15:08:54.157 回答
26

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

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

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

于 2010-01-13T14:10:04.647 回答
2

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

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

于 2010-01-13T12:09:36.833 回答
2

尝试:

NumberFormat.getCurrencyInstance(Locale.CANADA);

于 2015-10-30T15:35:57.977 回答
0
NumberFormat.getCurrencyInstance(Locale.UK);
于 2015-12-23T14:34:10.143 回答
0

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

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

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

于 2018-04-18T19:43:27.697 回答
0

为什么 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!!!");
        }
    }
}
于 2018-10-22T15:02:58.007 回答