Отформатируйте отрицательное количество долларов США со знаком минус, а не в скобках (Java) - PullRequest
29 голосов
/ 13 января 2010

Как получить NumberFormat.getCurrencyInstance() для печати отрицательных значений в долларах США со знаком минус?

Ответы [ 7 ]

36 голосов
/ 12 октября 2010

Требуется небольшая настройка 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() может не возвращать значение для всех локалей для всех систем, но оно должно работать для основных (и я думаю, что оно само по себе имеет разумный запасной вариант, поэтому вам не нужно ничего делать )

22 голосов
/ 13 января 2010

Вот один, который я всегда использую в java-классе или через тег fmt: formatNumber jstl:

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

Всегда выдает не менее 0,00 долл. США и соответствует при отображении. Также включает в себя тысячи разделителей, где это необходимо. Вы можете переместить знак минус перед знаком доллара, если это требуется.

2 голосов
/ 30 октября 2015

Попробуйте:

NumberFormat.getCurrencyInstance(Locale.CANADA);

2 голосов
/ 13 января 2010

Вероятно, лучше создать свой собственный DecimalFormat, если вы хотите использовать определенный формат, а не полагаться на стандартный.

Редактировать: Возможно, вы также можете привести результат NumberFormat.getCurrencyInstance () к DecimalFormat и настроить его в соответствии со своими предпочтениями.

0 голосов
/ 22 октября 2018

Почему poi ОТКАЗЫВАЕТСЯ от поддержки опции FIRST в формате Excel, мне не подходит! enter image description here

Мне не нравится использовать 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!!!");
        }
    }
}
0 голосов
/ 18 апреля 2018

Поскольку я снова столкнулся с этой проблемой, я провел некоторое исследование и нашел более гибкое решение, предоставляемое ICU :

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

Для получения дополнительной информации см. Документацию API NumberFormatter .

0 голосов
/ 23 декабря 2015
NumberFormat.getCurrencyInstance(Locale.UK);
...