Преобразование целого числа в строку с запятой для тысяч


182

Я хочу преобразовать целое число 35634646, чтобы иметь тысячу ", поэтому оно должно быть 35 634 646.

Какой самый быстрый способ сделать это?

Ответы:


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

5
Я должен был добавить import java.text.NumberFormat;.
Майк С

6
Это вынуждает группировку стиля США, которая всегда использует ,, однако есть также регионы, которые используют .для группировки. Одним словом, жесткое программирование локали считается плохой практикой.
Хай Чжан

4
@DreaminginCode Чтобы сделать это хорошо, Locale.getCurrent()есть решение
Роджер Р.В.

@RogerRV Нет Locale.getCurrent () (по крайней мере, на Android)
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) ...и т.д. Таким образом, аргумент сборщика мусора не так силен, как кажется.
Шейнтод

2
Это мой любимый ответ, вопрос просит работать с Integer, поэтому вот код: int value = 100000; String.format ("%, d", значение);
Псуцци

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

Вывод: 35,634,646


1
Ваш шаблон не должен быть больше, чем #,###, если вы хотите европейский стиль форматирования, то вы можете использовать #,##,###.
Али

7
@ Али: Описанный вами формат используется только в Индии, и я уверен, что по крайней мере на 90% Индия не в Европе.
Кайрнарвон

Я понял ... хорошо, если вам нужно индийское форматирование, то вот как вы это делаете.
Али

1
Это зависит от локали и не даст правильного (в соответствии с вопросом) вывода, если запускать там, где локаль по умолчанию не разделяет тысячи с помощью ,.
Антак

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

Если то же самое должно быть сделано в JSP, используйте:

<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

использовать расширение

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интер.

Не уверен, но у меня работает.


это не компилируется для меня
Mishax

"Не уверен в этом." Бессмысленно.
Роб Шепард

-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.