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

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

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

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

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

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

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

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

currentLocale можно получить из Locale.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.

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

 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; } } 
  • Как выполнить java .class из командной строки
  • Почему main () в java void?
  • Как проверить, не является ли текущий stream не основным streamом
  • Как получить текущий момент в формате ISO 8601 с датой, часом и минутой?
  • Ошибка манифеста слияния
  • Как вызвать веб-службу SOAP на Android
  • Невозможно создать следующие classы: - android.support.v7.widget.Toolbar
  • Android: как анализировать URL-адрес String с пробелами для URI-объекта?
  • Как подсчитать количество документов в коллекции Firestore?
  • Android Microsoft Office Library (.doc, .docx, .xls, .ppt и т. Д.)
  • Как отображать данные из Firestore в RecyclerView с Android?
  • Давайте будем гением компьютера.