Перетворення цілого числа в рядок із комою для тисяч


182

Я хочу перетворити Integer 35634646, щоб він мав тисячу "", так що це повинно бути 35 634 646.

Який би найшвидший спосіб зробити це?

Відповіді:


292
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646

5
Довелося додати import java.text.NumberFormat;.
Майк S

6
Це змушує угрупування стилів США, яке завжди використовується ,, однак є також регіони, які використовуються .для групування. Словом, жорстке кодування локалі вважається поганою практикою.
Хай Чжан

4
@DreaminginCode Щоб зробити це добре, Locale.getCurrent()це рішення
Roger RV

@RogerRV Немає Locale.getCurrent () (принаймні на андроїд)
E.Akio

Так, це не найкраща відповідь для 96% людей, які не живуть у США
рис.

152

Ви запитуєте якнайшвидше, але, можливо, ви маєте на увазі "найкращий" чи "правильний" чи "типовий"?

Ви також просите комами вказати тисячі, але, можливо, ви маєте на увазі "в нормальній для людини формі, зрозумілій відповідно до місцевого звичаю вашого користувача"?

Ви робите це так:

    int i = 35634646;
    String s = NumberFormat.getIntegerInstance().format(i);

Американці отримають "35 634 646"

Німці отримають "35.634.646"

Швейцарські німці отримають "35'634'646"


Де я можу взяти числовий шаблон кожної мови? Я спробував прочитати код, але не можу його знайти ніде
nhoxbypass


41

Цілі числа:

int value = 100000; 
String.format("%,d", value); // outputs 100,000

Парний:

double value = 21403.3144d;
String.format("%,.2f", value); // outputs 21,403.31

String.format досить потужний.

- Відредаговано за відгуками psuzzi .


1
Перевага: немає "нового", не завантажує сміттєзбірник (на відміну від DecimalFormat).
Контанго

Погляньте String.format. Починається з return new Formatter(l) ...т. Д. Тож аргумент щодо збирання сміття не настільки сильний, як здається.
Scheintod

2
Це моя улюблена відповідь, на питання задається робота з Integer, тому ось код: int value = 100000; String.format ("%, d", значення);
psuzzi

20
 int value = 35634646;
 DecimalFormat myFormatter = new DecimalFormat("#,###");
 String output = myFormatter.format(value);
 System.out.println(output);

Вихід: 35,634,646


1
Ваш шаблон не повинен бути більше #,###, якщо ви хочете форматування європейського стилю, тоді ви можете використовувати #,##,###.
Алі

7
@Ali: Формат, який ви описуєте, використовується лише в Індії, і я принаймні на 90% впевнений, що Індії немає в Європі.
Cairnarvon

Я розумію ... чудово, якщо вам потрібне індійське форматування, то так ви і робите.
Алі

1
Це залежить від місцевості та не дасть правильного (відповідно до запитання) виводу, якщо запустити там, де локаль за замовчуванням не розділяє тисячі з a ,.
антак

17

Інші відповіді правильні, проте двічі перевірте свою мову перед використанням "%,d":

Locale.setDefault(Locale.US);
int bigNumber = 35634646;
String formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Locale.setDefault(new Locale("pl", "PL"));
formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Результат:

35,634,646
35 634 646

3

Це рішення працювало для мене:

NumberFormat.getNumberInstance(Locale.US).format(Integer.valueOf("String Your Number"));

3

Використовуйте %dспецифікатор формату з комою:%,d

Це, безумовно, найпростіший спосіб.


1

Якщо те ж саме потрібно зробити в СПП, використовуйте:

<fmt:formatNumber pattern="#,##0" value="${yourlist.yourintvalue}" var="formattedVariable" />
<c:out value="${formattedVariable}"></c:out>

звичайно для використання декількох значень:

<c:forEach items="${yourlist}" var="yourlist">

    <fmt:formatNumber pattern="#,##0" value="${yourlist.yourintvalue}" var="formattedVariable" />
    <c:out value="${formattedVariable}"></c:out>
</c:forEach>

1

ось рішення для тих із вас, хто не може отримати доступ до "numberformat" або "String.format" (використовуючи обмежену версію Java в рамках). Сподіваюся, що це корисно.

number= 123456789;
thousandsSeparator=",";
myNumberString=number.toString();   
numberLength=myNumberString.length;
howManySeparators=Math.floor((numberLength-1)/3)
formattedString=myNumberString.substring(0,numberLength-(howManySeparators*3))
while (howManySeparators>0)    {
formattedString=formattedString+thousandsSeparator+myNumberString.substring(numberLength-(howManySeparators*3),numberLength-((howManySeparators-1)*3));
howManySeparators=howManySeparators-1;    }

formattedString

Спробуйте відредагувати свою відповідь, додавши до коду деякі коментарі (і, можливо, оберніть її методом, щоб це було корисніше)
noiaverbale

0

використовувати Extension

import java.text.NumberFormat

val Int.commaString: String
  get() = NumberFormat.getInstance().format(this)

val String.commaString: String
  get() = NumberFormat.getNumberInstance().format(this.toDouble())

val Long.commaString: String
  get() = NumberFormat.getInstance().format(this)

val Double.commaString: String
  get() = NumberFormat.getInstance().format(this)

результат

1234.commaString => 1,234
"1234.456".commaString => 1,234.456
1234567890123456789.commaString => 1,234,567,890,123,456,789
1234.456.commaString => 1,234.456

-1

ви не можете використовувати

System.out.printf("%n%,d",int name);

Кома в значку printfповинна додавати коми в %dміжряддя.

Не позитивно щодо цього, але працює на мене.


це не для мене
Мішакс

"Не позитивно щодо цього". Безглуздо.
Роб Шеферд

-8

Спочатку потрібно включити теги JSTL: -

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

на початку сторінки

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