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

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

документы


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

Я знаю, что мне нужно использовать 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"

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 (символы);


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

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

1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20



Хотя этот код может предоставить решение вопроса, лучше добавить контекст, объясняющий, почему и как он работает. Это может помочь будущим пользователям учиться и применять эти знания в собственном коде. Вы также, вероятно, получите положительные отзывы от пользователей в виде голосов "за" после объяснения кода.
borchvm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.