Как изменить десятичный разделитель 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

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

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

6 ответов


вы можете изменить разделитель, установив языковой стандарт или используя 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 можно получить из локали.getDefault (), т. е.:

Locale currentLocale = Locale.getDefault();

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

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

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


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

BigDecimal, похоже, не уважает настройки локали.

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, форматтеры выполняют работу правильно и знают локаль.


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

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

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