Формат отрицательной суммы в долларах США со знаком минус, а не в квадратных скобках (Java)

StackOverflow https://stackoverflow.com/questions/2056400

Вопрос

Как мне получить 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, выше моего понимания! enter image description here

Мне не нравится использовать 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!!!");
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top