Як змінити десятковий роздільник DecimalFormat з коми на крапку / крапку?


204

У мене є цей маленький божевільний метод, який перетворює значення 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

Мені потрібен роздільник, щоб бути крапкою або крапкою, а не комою. Хтось має підказку, як здійснити цей маленький подвиг?

Я читав це, зокрема це до смерті, але не можу знайти спосіб зробити це. Чи я підходжу до цього неправильно? Чи є набагато більш елегантний спосіб зробити це? Можливо, навіть рішення, яке пояснює різні представлення місцевих чисел, оскільки кома була б ідеальною за європейськими мірками.


Відповіді:


323

Ви можете змінити роздільник, встановивши локаль або використовуючи символи 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();

1
ви можете використовувати applyPattern у десятковому форматі, щоб отримати свій .00
krystan honor

Я змінив otherSymbols.setDecimalSeparator (','); як і іншіSymbols.setDecimalSeparator ('.'); Дякую. Це працює на мене.
Ааканкша

2
як виглядає формат, наприклад, String formatString = "#,###,###,##0.00";див. docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html для синтаксису
Vulpo

1
"Ви можете використовувати європейський локал". Ну, ви не можете використовувати будь-яку локаль з Європи, тому що Locale.UKповернетесь, 1,567.90 а не 1.567,90
Junior Mayhé

Бічна примітка: NumberFormat.getNumberInstance()на деяких пристроях Android 7 може працювати незвично повільно. Альтернативою є те, String.format()що працює швидко. Дивіться stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE

14

Європа досить величезна. Я не впевнений, чи використовують вони однаковий формат у всьому світі. Однак ця чи ця відповідь допоможе.

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

Тобто використовувати правильну локаль.


1
Справді, сер! У Великобританії очікується "1 344,00 фунтів стерлінгів", тоді як у Франції очікується "1 234,00 €" (роздільник групи, десятковий роздільник, символ валюти та валютна позиція змінилися).
Вульпо

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

5

Здається, 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, форматори виконують цю роботу належним чином і знають про локальну мову.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.