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?

Dominik
la source

Réponses:

293
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646
Ing. Fouad
la source
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"

Steve McLeod
la source
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 .

Frankie
la source
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

Bala R
la source
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
Grzegorz Szpetkowski
la source
3

Cette solution a fonctionné pour moi:

NumberFormat.getNumberInstance(Locale.US).format(Integer.valueOf("String Your Number"));
COMME
la source
3

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

C'est de loin le moyen le plus simple.

Annie Johnson
la source
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>
Navankur Chauhan
la source
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
user1807050
la source
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
Changhoon
la source
-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.

Josh
la source
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

Ankur
la source