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

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

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


person MiraFayless    schedule 19.02.2011    source источник
comment
См. Также stackoverflow.com/questions / 5236056 /   -  person Vadzim    schedule 03.05.2014
comment
Смените язык, у меня это сработало. stackoverflow.com/questions/4947484/   -  person Alper Şekercioğlu    schedule 25.10.2020


Ответы (7)


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

Locale currentLocale = Locale.getDefault();
person Chris    schedule 19.02.2011
comment
вы можете использовать applyPattern в десятичном формате, чтобы получить ваш .00 - person krystan honour; 29.10.2014
comment
Я изменил otherSymbols.setDecimalSeparator (','); как otherSymbols.setDecimalSeparator ('.'); Спасибо. У меня работает. - person Aakanksha; 03.07.2015
comment
это то, как выглядит формат, например String formatString = "#,###,###,##0.00"; см. docs.oracle.com/javase/7/ docs / api / java / text / DecimalFormat.html для синтаксиса. - person Vulpo; 31.03.2016
comment
Вы можете использовать европейский язык. Ну, вы не можете использовать какой-либо языковой стандарт из Европы, потому что Locale.UK вернет 1,567.90 , а не 1,567,90 - person Junior Mayhé; 11.06.2017
comment
Боковое примечание: NumberFormat.getNumberInstance() может работать необычно медленно на некоторых устройствах Android 7. Альтернативой является String.format(), который работает быстро. См. stackoverflow.com/questions/2379221/java-currency-number-format - person Mr-IDE; 16.10.2017

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

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

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

person Reno    schedule 19.02.2011
comment
В самом деле, сэр! В Великобритании ожидается 1234,00 фунта стерлингов, тогда как во Франции ожидается 1 234,00 евро (разделитель групп, десятичный разделитель, символ валюты и положение валюты изменились). - person Vulpo; 31.03.2016

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

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

person Neikius    schedule 26.03.2012

В моем случае это сработало:

DecimalFormat df2 = new DecimalFormat("#.##");           
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
person Nather Webber    schedule 17.07.2020

вы можете просто использовать функцию замены, прежде чем возвращать строку в методе

return df.format(bd).replace(",", ".")
person bebeli555    schedule 03.11.2020

Это сработало для меня ...

    double num = 10025000;
    new DecimalFormat("#,###.##");
    DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
    System.out.println(df.format(num));
person Mayank Parihar    schedule 21.12.2020

person    schedule
comment
Число может быть в арабском формате, и в них используется другой разделитель: (٫) (в шестнадцатеричном формате U + 066B). en.wikipedia.org/wiki/Decimal_mark#Other_numeral_systems Цифры тоже разные: en.wikipedia.org/wiki/Arabic_ (Unicode_block) - person mtrakal; 17.08.2016