USD格式负数用减号,而不是括号(JAVA)
-
20-09-2019 - |
题
我要如何NumberFormat.getCurrencyInstance()
用减号打印负的美元货币价值?
解决方案 6
由于我再次面对这一问题,我做了一些研究,发现通过 ICU <提供更有弹性的溶液/一个>:
NumberFormatter
.withLocale(...)
.unit(Currency.getInstance("USD"))
.sign(SignDisplay.AUTO) // "123", "0", and "-123"
.format(123)
.toString();
其他提示
它需要由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()
可能不返回所有系统所有区域设置的值,但它应该为主要的工作(我认为它有其自身合理的回退,所以你不应该做任何事情)
下面是一个I总是最终使用或者在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);
为什么POI拒绝支持在Excel货币格式的第一个选项是超越我!
我不喜欢使用的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!!!");
}
}
}