Как изменить десятичный разделитель DecimalFormat от запятой до точки/точки?

У меня есть этот маленький сумасшедший метод, который преобразует значения 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

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

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

Ответ 1

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

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

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

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

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

currentLocale может быть получен из Locale.getDefault() i.e.:

Locale currentLocale = Locale.getDefault();

Ответ 2

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

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);

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

Ответ 3

public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}

Ответ 4

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(). Я думаю, что это хорошо в некотором роде. Сериализация, например, или отладка. Существует уникальное строковое представление.

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

Ответ 5

String money = output.replace(',', '.');

Ответ 6

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

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;
    }
}