Как изменить десятичный разделитель 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 можно получить из 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.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, форматтеры выполняют работу правильно и знают о локали.
просто заменить '.'С ',' в конце пользовательского интерфейса
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; } }
Comments