Как установить разделитель тысяч в Java?

129

Как установить разделитель тысяч в Java?
У меня есть строковое представление BigDecimal, которое я хочу отформатировать с помощью разделителя тысяч и вернуть как String.

Время веселья
источник
вы получаете эти значения из БД?
Dead Programmer

Ответы:

110

Это должно работать (непроверено, на основе JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Согласно JavaDoc, приведение в первой строке должно быть сохранено для большинства локалей.

Андреас Долк
источник
16
Непроверенные комментарий по этому: Javadoc для getDecimalFormatSymbols()говорит: Returns: a copy of the desired DecimalFormatSymbols. Так что вы должны использовать setDecimalFormatSymbols(theCopy)после изменения копии.
java.is.for.desktop 05
6
В документации для bd.longValue () сказано, что «любая дробная часть будет отброшена». Так что я не знаю, лучший ли это способ сделать это, если вы заботитесь о точности
codinguser
2
Думаю, вы могли бы использовать newи вернуть его в форматтер: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Ли Йи Хун
Я думаю, вы хотели бы использовать \ u00a0 (неразрывный пробел) в качестве разделителя группировки. Это значение по умолчанию для некоторых языков.
ACV
3
Почему вы называете longValue? Вопрос заключался в том, чтобы установить оператор тысяч для BigDecimal, не долго.
FINDarkside
232

Вы можете использовать функцию форматирования с ",";

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," включает символы группировки, зависящие от локали.

документы

syloc
источник
11
Что, если я хочу использовать .в качестве разделителя?
Enissay
Поскольку я обычно использую String.format, он для меня самый лучший и простой!
Али
17
@Enissay Вызов format()с явным локал ( Local.USкак известно, использование в ,качестве разделителя) , а затем заменить ,с пользовательским сепаратором: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif
java.util.IllegalFormatConversionException:% d не может форматировать аргументы java.lang.String
Иман Мараши,
1
@ImanMarashi Передайте это в файл int. Или long. Или BigInteger. И используйте f, если хотите использовать double, floatили BigDecimal.
Adowrath 05
57
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

РЕДАКТИРОВАТЬ

Чтобы получить настраиваемый разделитель группировки, например пробел, выполните следующие действия:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));
adarshr
источник
Я знаю, что мне нужно использовать DecimalFormatSymbols setGroupingSeparator, но я не знаю, как применить его к моему BigDecimal
Funtime
1
@Funtime: вы не «применяете это к своему BigDecimal». Вы создаете NumberFormatобъект с желаемыми свойствами и используете его для форматирования файла BigDecimal. A BigDecimalимеет только указанное значение, у него нет указанного формата.
Joachim Sauer
1
Обратите внимание, что разделитель тысяч обычно представляет собой неразрывный пробел (когда это пробел)
cquezel
Пришлось изменить верхнюю строку во втором варианте на DecimalFormatSymbols symbols = new DecimalFormatSymbols (); чтобы это работало.
PaperThick
14

попробуйте отформатировать этот код так, как он используется в Бразилии:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"
dellasavia
источник
2
Вы тоже попробуйте это, в случае JasperReports, принудительно установить правильный формат: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); отправьте этот параметр в отчет.
dellasavia
8

Если вы используете разделитель тысяч для целочисленного типа данных, используйте 1.

  1. Для целочисленного типа данных

String.format ("%, d \ n", 58625) и вывод будет 58 625

  1. Для данных с плавающей запятой введите String.format ("% ,. 2f", 58625.21), и результат будет 58 625.21.
Вакас Ахмед
источник
Это было прозрение. Однако вы действительно должны подчеркнуть, что «,» - это всего лишь флаг, а не символ, который он использует в качестве разделителя групп. (Мне потребовалось
Ванког
5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);
Мертвый программист
источник
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
болтливость
источник
3

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

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Новая строка такова: formatter.setDecimalFormatSymbols (символы);

Amio.io
источник
2

Для десятичных знаков :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));
akelec
источник
1

Как упоминалось выше, следующая ссылка дает вам конкретный код страны, позволяющий Java локализовать номер. У каждой страны свой стиль.

По ссылке выше вы найдете код страны, который нужно разместить здесь:

...(new Locale(<COUNTRY CODE HERE>));

Швейцария, например, форматирует числа следующим образом:

1000,00 -> 1 000,00

код страны

Для этого у меня работают следующие коды :

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

Результат ожидаемый:

1'000.00
0xjacobb
источник
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Кадир Эртюрк
источник
Хотя этот код может предоставить решение вопроса, лучше добавить контекст, объясняющий, почему и как он работает. Это может помочь будущим пользователям учиться и применять эти знания в собственном коде. Вы также, вероятно, получите положительные отзывы от пользователей в виде голосов "за" после объяснения кода.
borchvm