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?

Respostas:


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

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"


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 .


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


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

3

Esta solução funcionou para mim:

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

3

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

Esta é de longe a maneira mais fácil.


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>

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

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

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.