Conversion d'un entier en chaîne avec une virgule pour des milliers


182

Je veux convertir un entier 35634646 pour avoir le millier "," donc il devrait être 35,634,646.

Quel serait le moyen le plus rapide d'y parvenir?

Réponses:


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

5
J'ai dû ajouter import java.text.NumberFormat;.
Mike S

6
Cela force le regroupement de style américain qui utilise toujours ,, mais il y a aussi des régions qui utilisent .pour le regroupement à la place. En un mot, coder en dur une locale est considéré comme une mauvaise pratique.
Hai Zhang

4
@DreaminginCode Pour bien le faire, c'est Locale.getCurrent()la solution
Roger RV

@RogerRV Il n'y a pas de Locale.getCurrent () (au moins sur Android)
E.Akio

Ouais ce n'est pas la meilleure réponse pour les 96% de personnes qui ne vivent pas aux USA
fig

152

Vous demandez le plus rapide, mais peut-être voulez-vous dire «meilleur» ou «correct» ou «typique»?

Vous demandez également des virgules pour indiquer des milliers, mais peut-être voulez-vous dire "sous une forme lisible par l'homme selon la coutume locale de votre utilisateur"?

Vous le faites comme ceci:

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

Les Américains obtiendront "35 634 646"

Les Allemands obtiendront "35.634.646"

Les Allemands suisses obtiendront "35'634'646"


Où puis-je obtenir le modèle numérique de chaque paramètre régional? J'ai essayé de lire le code mais je ne le trouve nulle part
nhoxbypass


41

Entiers:

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

Double:

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

String.format est assez puissant.

- Modifié par feedback psuzzi .


1
Avantage: Pas de "nouveau", ne charge pas le ramasse-miettes (contrairement à DecimalFormat).
Contango du

Jetez un œil String.format. Cela commence par return new Formatter(l) ...etc. L'argument du ramasse-miettes n'est donc pas aussi fort qu'il n'y paraît.
Scheintod

2
C'est ma réponse préférée, la question demande de travailler avec Integer, voici donc le code: int value = 100000; String.format ("%, d", valeur);
psuzzi

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

Production: 35,634,646


1
Votre motif n'a pas besoin d'être plus que #,###, si vous voulez un formatage de style européen, vous pouvez l'utiliser #,##,###.
Ali

7
@Ali: Le format que vous décrivez n'est utilisé qu'en Inde, et je suis sûr à au moins 90% que l'Inde n'est pas en Europe.
Cairnarvon

Je comprends ... très bien, si vous avez besoin d'un formatage indien, c'est ainsi que vous le faites.
Ali

1
Cela dépend de la locale et ne produira pas la sortie correcte (selon la question) si elle est exécutée là où la locale par défaut ne sépare pas les milliers avec un ,.
antak

17

Les autres réponses sont correctes, mais vérifiez bien vos paramètres régionaux avant d'utiliser "%,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);

Résultat:

35,634,646
35 634 646

3

Cette solution a fonctionné pour moi:

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

3

Utilisez le %dspécificateur de format avec une virgule:%,d

C'est de loin le moyen le plus simple.


1

Si la même chose doit être faite dans la JSP, utilisez:

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

bien sûr, pour plusieurs valeurs, utilisez:

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

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

1

voici une solution pour ceux d'entre vous qui ne peuvent accéder à «numberformat» ni à «String.format» (en utilisant une version limitée de java dans un framework). J'espère que c'est 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

Pensez à modifier votre réponse en ajoutant des commentaires à votre code (et peut-être l'envelopper dans une méthode, donc cela peut être plus utile)
noiaverbale

0

utiliser l'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)

résultat

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

ne peux-tu pas utiliser un

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

La virgule dans le printfdevrait ajouter les virgules dans l' %dinter.

Pas positif à ce sujet, mais fonctionne pour moi.


ce n'est pas une compilation pour moi
Mishax

"Pas positif à ce sujet." Inutile.
Rob Shepherd

-8

Vous devez d'abord inclure les balises JSTL: -

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

au début de la page

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.