Формат отрицательной суммы в долларах США со знаком минус, а не в квадратных скобках (Java)
-
20-09-2019 - |
Вопрос
Как мне получить NumberFormat.getCurrencyInstance()
выводить отрицательные значения валюты USD со знаком минус?
Решение 6
Поскольку я снова столкнулся с этой проблемой, я провел некоторое исследование и нашел более надежное решение, предоставленное Отделение интенсивной терапии:
NumberFormatter
.withLocale(...)
.unit(Currency.getInstance("USD"))
.sign(SignDisplay.AUTO) // "123", "0", and "-123"
.format(123)
.toString();
Проверьте документацию API для Числовой форматировщик для получения более подробной информации.
Другие советы
Это требует небольшой настройки десятичного формата, возвращаемого 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);
Почему poi ОТКАЗЫВАЕТСЯ поддерживать ПЕРВЫЙ вариант форматирования валюты в Excel, выше моего понимания!
Мне не нравится использовать DecimalFormat для currency, потому что значение вашей конечной ячейки становится нечисловым с введением символа валюты.Во время работы в крупном финансовом учреждении мне было поручено решить эту проблему с форматированием.Основная идея этого изменения заключается в том, что, поскольку 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!!!");
}
}
}