Convertendo Inteiro em String com vírgula para milhares

182

Quero converter um número inteiro 35634646 para ter os mil "," e, portanto, deve ser 35.634.646.

Qual seria a maneira mais rápida de fazer isso?

Dominik
fonte

Respostas:

292
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646
Eng.Fouad
fonte
5
Eu tive que adicionar import java.text.NumberFormat;.
Mike S
6
Isso força o agrupamento de estilos dos EUA que sempre usa ,, no entanto, também existem regiões que usam .para agrupar. Em uma palavra, codificar um código de idioma é considerado uma prática ruim.
Hai Zhang
4
@DreaminginCode Fazê-lo bem Locale.getCurrent()é a solução #
Roger RV
@RogerRV Não há Locale.getCurrent () (pelo menos no android)
E.Akio
Sim, essa não é a melhor resposta para 96% das pessoas que não vivem nos EUA
fig
152

Você pede o mais rápido, mas talvez você queira dizer "melhor" ou "correto" ou "típico"?

Você também pede vírgulas para indicar milhares, mas talvez você queira dizer "na forma legível humana normal, de acordo com o costume local do seu usuário"?

Você faz assim:

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

Os americanos receberão "35.634.646"

Alemães receberão "35.634.646"

Alemães suíços receberão "35'634'646"

Steve McLeod
fonte
Onde posso obter o padrão numérico de cada localidade? Tentei ler o código, mas não pode encontrá-lo em qualquer lugar
nhoxbypass
41

Inteiros:

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

Duplas:

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

String.format é bastante poderoso.

- Editado por feedback do psuzzi .

Frankie
fonte
1
Vantagem: Nenhum "novo", não carrega o coletor de lixo (diferente do DecimalFormat).
Contango 15/09
Dê uma olhada String.format. Começa com return new Formatter(l) ...etc. Portanto, o argumento do coletor de lixo não é tão forte quanto parece.
Scheintod 25/09
2
Esta é a minha resposta favorita, a pergunta pede para trabalhar com Inteiro, então aqui está o código: int value = 100000; String.format ("%, d", valor);
Psl # 6/19
20
 int value = 35634646;
 DecimalFormat myFormatter = new DecimalFormat("#,###");
 String output = myFormatter.format(value);
 System.out.println(output);

Resultado: 35,634,646

Bala R
fonte
1
Seu padrão não precisa ser maior que #,###, se você deseja formatar o estilo europeu, poderá usá-lo #,##,###.
Ali
7
@ Ali: O formato que você descreve é ​​usado apenas na Índia, e tenho pelo menos 90% de certeza de que a Índia não está na Europa.
Cairnarvon
Entendi ... bom, se você precisar de formatação indiana, é assim que você faz.
Ali
1
Isso depende da localidade e não produzirá a saída correta (conforme a pergunta) se executada onde a localidade padrão não separa milhares com a ,.
antak
17

As outras respostas estão corretas; no entanto, verifique seu código do idioma antes de usar "%,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);

Resultado:

35,634,646
35 634 646
Grzegorz Szpetkowski
fonte
3

Esta solução funcionou para mim:

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

Use o %despecificador de formato com uma vírgula:%,d

Esta é de longe a maneira mais fácil.

Annie Johnson
fonte
1

Se o mesmo precisar ser feito no JSP, use:

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

curso para múltiplos valores use:

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

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

aqui está uma solução para aqueles que não conseguem acessar "numberformat" nem "String.format" (usando uma versão limitada do java dentro de uma estrutura). Espero que seja útil.

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
user1807050
fonte
Considere a editar a sua resposta adicionando alguns comentários ao seu código (e talvez envolvê-la em um método, por isso pode ser mais útil)
noiaverbale
0

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

resultado

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
Changhoon
fonte
-1

você não pode usar um

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

A vírgula no printfdeve adicionar as vírgulas no %dinter.

Não é positivo, mas funciona para mim.

Josh
fonte
que não está compilando para mim
Mishax
"Não é positivo sobre isso." Sem sentido.
Rob Shepherd
-8

Primeiro você precisa incluir as tags JSTL: -

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

no início da página

Ankur
fonte