如何NumberFormat.getCurrencyInstance()
打印带有减号的负美元货币值?
7 回答
它需要对返回的 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()
可能不会为所有系统的所有语言环境返回一个值,但它应该适用于主要系统(我认为它本身有一个合理的回退,所以你不应该做任何事情)
这是我总是在 java 类中或通过 fmt:formatNumber jstl 标记使用的一个:
DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);
它总是产生至少 0.00 美元,并且在显示时是一致的。还包括数千个需要的分隔符。如果这是您的要求,您可以将减号移到美元符号前面。
DecimalFormat
如果您想要特定格式而不是依赖默认格式,最好创建自己的格式。
编辑:您可能还可以将 NumberFormat.getCurrencyInstance() 的结果转换为DecimalFormat
并根据您的喜好进行调整。
尝试:
NumberFormat.getCurrencyInstance(Locale.CANADA);
NumberFormat.getCurrencyInstance(Locale.UK);
由于我再次遇到这个问题,我做了一些研究,并找到了ICU提供的更具弹性的解决方案:
NumberFormatter
.withLocale(...)
.unit(Currency.getInstance("USD"))
.sign(SignDisplay.AUTO) // "123", "0", and "-123"
.format(123)
.toString();
查看NumberFormatter的 API 文档以获取更多详细信息。
为什么 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!!!");
}
}
}