web-dev-qa-db-fra.com

Ajouter des virgules (séparateur de regroupement) au nombre sans modifier les décimales?

J'essaie de formater une chaîne pour ajouter des virgules entre 3 groupes de chiffres

PAR EXEMPLE:

1200.20 >> 1,200.20
15000   >> 15,000

J'essaie de comprendre comment faire avec DecimalFormat. À ce stade, j'utilise un script qui me semble trop compliqué. Je n'arrive pas à comprendre comment faire. Utiliser # masque simplement les zéros à la fin et utiliser 0 les ajoute au nombre.

C'est ce que j'essaie en ce moment:

DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US));
resultStr = df.format(Double.valueOf(resultStr));

Je suis sûr que cela doit être facile mais je ne sais pas comment le faire. Je n'ai pas à le faire avec DecimalFormat, je pensais que ce serait le moyen le plus simple. Comment puis-je simplement ajouter les virgules sans modifier les décimales?

10
lisovaccaro

Vous devez utiliser un objet NumberFormat et le définir pour utiliser le regroupement. Quelque chose comme

import Java.text.DecimalFormat;
import Java.text.NumberFormat;
import Java.util.Locale;

public class NumberFormatEg {
   public static void main(String[] args) {
      NumberFormat myFormat = NumberFormat.getInstance();
      myFormat.setGroupingUsed(true);

      double[] numbers = { 11220.00, 232323232.24, 121211.55, 102.121212 };

      for (double d : numbers) {
         System.out.println(myFormat.format(d));
      }
      System.out.println();

      DecimalFormat decimalFormat = new DecimalFormat("#.00");
      decimalFormat.setGroupingUsed(true);
      decimalFormat.setGroupingSize(3);

      for (double d : numbers) {
         System.out.println(decimalFormat.format(d));
      }

      System.out.println("\nFor Germany");

      NumberFormat anotherFormat = NumberFormat
            .getNumberInstance(Locale.GERMAN);
      if (anotherFormat instanceof DecimalFormat) {
         DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat;
         anotherDFormat.applyPattern("#.00");
         anotherDFormat.setGroupingUsed(true);
         anotherDFormat.setGroupingSize(3);

         for (double d : numbers) {
            System.out.println(anotherDFormat.format(d));
         }

      }

      System.out.println("\nFor US:");

      anotherFormat = NumberFormat.getNumberInstance(Locale.US);
      if (anotherFormat instanceof DecimalFormat) {
         DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat;
         anotherDFormat.applyPattern("#.00");
         anotherDFormat.setGroupingUsed(true);
         anotherDFormat.setGroupingSize(3);

         for (double d : numbers) {
            System.out.println(anotherDFormat.format(d));
         }

      }
   }
}

qui retourne:

11,220
232,323,232.24
121,211.55
102.121

11,220.00
232,323,232.24
121,211.55
102.12

For Germany
11.220,00
232.323.232,24
121.211,55
102,12

For US:
11,220.00
232,323,232.24
121,211.55
102.12

Un avantage de ceci est que la solution peut être spécifique à l'environnement local.

Edité
Affiche maintenant un exemple avec un objet DecimalFormat. Notez que vous devez définir la taille du groupe si vous l'utilisez.

16

Vous pouvez aussi essayer quelque chose comme

DecimalFormat df = new DecimalFormat("#,###.00");

System.out.println(df.format(1200.20));
System.out.println(df.format(15000));
System.out.println(df.format(123456789.99));
 1 200,20 
 15,000.00 
 123,456,789.99 
12
arshajii

Vous devriez être capable de faire exactement ce que vous voulez:

http://docs.Oracle.com/javase/tutorial/i18n/format/decimalFormat.html

DecimalFormat myFormatter = new DecimalFormat("$###,###.###");
String output = myFormatter.format(12345.67);
System.out.println(value + " " + pattern + " " + output);
2
paulsm4

La solution la plus simple

Pourquoi n'utilisez-vous pas le virgule , avec printf.

System.out.printf( "%,d\n", 58625 );// the d to accept decimal integer
System.out.printf( "%,.2f", 12345678.9 );// the f to accept folouting point and 2 to take only 2 digits  

La sortie sera

58,625
12,345,678.90

Et la bonne nouvelle: le séparateur généré réellement utilisé is specific to the user’s locale

1
Basheer AL-MOMANI

Je ne pouvais faire fonctionner aucune des autres solutions, certaines autour des décimales, certaines ajoutaient des zéros à la fin ou certaines supprimaient des zéros à la fin.

Je n'ai pas l'intention d'accepter ma propre réponse, mais je posterai mon script au cas où quelqu'un le jugerait utile.

public void(String str) {
    int floatPos = str.indexOf(".") > -1 ? str.length() - str.indexOf(".") : 0;
    int nGroups= (str.length()-floatPos-1-(str.indexOf("-")>-1?1:0))/3;
    for(int i=0; i<nGroups; i++){
        int commaPos = str.length() - i * 4 - 3 - floatPos;
    str = str.substring(0,commaPos) + "," + str.substring(commaPos,str.length());
    }
    return str;
}


1             => 1
1.0           => 1.0
1234.01       => 1,234.01
1100100.12345 => 1,100,100.12345
1
lisovaccaro