Как изменить десятичный разделитель DecimalFormat с запятой на точку / точку? - PullRequest
183 голосов
/ 20 февраля 2011

У меня есть этот маленький сумасшедший метод, который преобразует значения BigDecimal в красивые и удобочитаемые строки.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

Однако он также производит так называемый группирующий разделитель ",", который заставляет все мои значения выглядеть следующим образом:

xxx,xxx

Мне нужно, чтобы разделитель был точкой или точкой, а не запятой. Кто-нибудь знает, как совершить этот маленький подвиг?

Я прочитал это и, в частности, это до смерти, но я не могу найти способ сделать это. Я подхожу к этому неправильно? Есть ли более элегантный способ сделать это? Возможно, даже решение, которое учитывает различные локальные представления чисел, поскольку запятая будет идеальной по европейским стандартам.

Ответы [ 6 ]

296 голосов
/ 20 февраля 2011

Вы можете изменить разделитель либо установив локаль, либо используя DecimalFormatSymbols .

Если вы хотите, чтобы разделитель группировки был точкой, вы можете использовать европейский языковой стандарт:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

В качестве альтернативы вы можете использовать класс DecimalFormatSymbols для изменения символов, которые появляются в отформатированных числах, полученных методом format. Эти символы включают в себя десятичный разделитель, разделитель группировки, знак минус и знак процента, среди прочих:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale можно получить из Locale.getDefault (), т. Е .:

Locale currentLocale = Locale.getDefault();
13 голосов
/ 20 февраля 2011

Европа довольно огромна.Я не уверен, что они используют один и тот же формат.Однако этот или этот ответ поможет.

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

Т.е. используйте правильный языковой стандарт.

8 голосов
/ 15 октября 2011
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
5 голосов
/ 26 марта 2012

BigDecimal не соответствует настройкам Locale.

Locale.getDefault(); //returns sl_SI

Словенский язык должен иметь десятичную запятую. Похоже, у меня были странные заблуждения относительно чисел.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

Я отредактировал часть моего сообщения, которое не имело смысла, так как оно оказалось из-за человеческой ошибки (забыл зафиксировать данные и искал не ту вещь).

То же, что и BigDecimal, можно сказать для любых функций Java .toString (). Я думаю, это хорошо в некоторых отношениях. Сериализация например или отладка. Существует уникальное строковое представление.

Также как и другие, упомянутые с использованием форматеров, работает нормально. Просто используйте форматтеры, то же самое для внешнего интерфейса JSF, форматировщики делают работу правильно и знают язык.

3 голосов
/ 01 августа 2013
String money = output.replace(',', '.');
0 голосов
/ 25 июня 2016

Просто замените '.'с ',' в конце пользовательского интерфейса

import java.text.DecimalFormat;
public MyClass{
    private String netAmount;
    private static DecimalFormat twoDecimalForm = new DecimalFormat("00.00");

    public MyClass(double amount){
        //converting to required decimal format in constructor or/and setter
        this.amount=twoDecimalForm.format(amount);
    }

    public String getAmount() {
        //replacing decimal point with  comma so that in JSP ELs you'll get it in comma format
        return amount.replace(".",",");
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
}
...