Conversione di Integer in String con virgola per migliaia


182

Voglio convertire un intero 35634646 per avere il migliaio "," quindi dovrebbe essere 35.634.646.

Quale sarebbe il modo più veloce per farlo?

Risposte:


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

5
Ho dovuto aggiungere import java.text.NumberFormat;.
Mike S,

6
Ciò impone il raggruppamento in stile americano che usa sempre ,, tuttavia ci sono anche regioni che usano .invece per raggruppare. In una parola, la codifica hard di una locale è considerata una cattiva pratica.
Hai Zhang,

4
@DreaminginCode Per farlo bene Locale.getCurrent()è la soluzione
Roger RV,

@RogerRV Non esiste Locale.getCurrent () (almeno su Android)
E. Akio

Sì, questa non è la migliore risposta per il 96% delle persone che non vivono negli Stati Uniti
fico

152

Chiedete il più veloce, ma forse intendete "migliore" o "corretto" o "tipico"?

Chiedete anche virgole per indicarne migliaia, ma forse intendete "in normale forma leggibile dall'uomo secondo l'usanza locale dell'utente"?

Lo fai così:

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

Gli americani riceveranno "35.634.646"

I tedeschi riceveranno "35.634.646"

I tedeschi svizzeri riceveranno "35'634'646"


Dove posso trovare il modello numerico di ogni locale? Ho provato a leggere il codice ma non riesco a trovarlo da nessuna parte
nhoxbypass


41

Interi:

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

Doppio:

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

String.format è piuttosto potente.

- Modificato per feedback psuzzi .


1
Vantaggio: nessun "nuovo", non carica il garbage collector (a differenza di DecimalFormat).
Contango,

Dai un'occhiata String.format. Comincia con return new Formatter(l) ...ecc. Quindi l'argomento del Garbage Collector non è così forte come sembra.
Scheintod,

2
Questa è la mia risposta preferita, la domanda chiede di lavorare con Integer, quindi ecco il codice: int value = 100000; String.format ("%, d", valore);
psuzzi

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

Produzione: 35,634,646


1
Il modello non deve essere più di #,###, se si desidera la formattazione in stile europeo, è possibile utilizzare #,##,###.
Ali,

7
@Ali: il formato che descrivi è usato solo in India, e sono sicuro almeno dell'90% che l'India non sia in Europa.
Cairnarvon,

Ho capito ... bene, se hai bisogno di formattazione indiana, allora è così che lo fai.
Ali,

1
Questo dipende dalla locale e non produrrà l'output corretto (come da domanda) se eseguito dove la locale predefinita non separa migliaia con a ,.
Antak,

17

Le altre risposte sono corrette, tuttavia ricontrolla le impostazioni locali prima di utilizzare "%,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);

Risultato:

35,634,646
35 634 646

3

Questa soluzione ha funzionato per me:

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

3

Utilizzare l' %didentificatore di formato con una virgola:%,d

Questo è di gran lunga il modo più semplice.


1

Se lo stesso deve essere fatto nel JSP, utilizzare:

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

ofcourse per più valori utilizzare:

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

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

1

ecco una soluzione per quelli di voi che non possono accedere a "numberformat" né a "String.format" (usando una versione limitata di java all'interno di un framework). Spero sia utile.

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

Considera di modificare la tua risposta aggiungendo alcuni commenti al tuo codice (e magari includendolo in un metodo, quindi può essere più utile)
noiaverbale

0

usa l'estensione

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)

risultato

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

non puoi usare a

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

La virgola in printfdovrebbe aggiungere le virgole all'interno %d.

Non positivo, ma funziona per me.


non è una compilazione per me
Mishax,

"Non positivo." Inutile.
Rob Shepherd,

-8

Per prima cosa devi includere i tag JSTL: -

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

all'inizio della pagina

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.