Як встановити роздільник тисяч у Java?


129

Як встановити роздільник тисяч у Java?
У мене є String-представлення BigDecimal, яке я хочу відформатувати за допомогою роздільника тисяч і повернути як String.


Ви отримуєте ці значення з БД?
Мертвий програміст

Відповіді:


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

6
Документи для bd.longValue () кажуть, "будь-яка дробова частина буде відкинута". Тож я не знаю, чи це найкращий спосіб зробити це, якщо ви дбаєте про точність
кодуванняuser

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
Що робити, якщо я хочу використовувати .роздільник?
Еніссей

Оскільки я зазвичай використовую String.format, це найкраще і найпростіше для мене!
Алі

16
@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

56
BigDecimal bd = new BigDecimal(300000);

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

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

EDIT

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

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має лише вказане значення, воно не має вказаного формату.
Йоахім Зауер

1
Зауважте, що роздільник тисяч - це звичайно нерозривний простір (коли це пробіл)
cquezel

Довелося змінити верхній рядок у другому варіанті на символи DecimalFormatSymbols = 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

Якщо ви використовуєте роздільник тисяч для типу даних Integer, використовуйте 1.

  1. Для цілих даних Тип

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

  1. Для даних з плаваючою точкою введіть String.format ("% ,. 2f", 58625.21), а вихід буде 58,625.21

Це було богоявлення. Однак вам дійсно потрібно наголосити, що "" є лише прапором, а не символом, який він використовує як роздільник групи. (У мене було часу, щоб знайти проблему.) Див. Docs.oracle.com/javase/7/docs/api/java/util/Formatter.html
Vankog

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.