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