Добавить запятые (разделитель группировки) в число без изменения десятичных знаков?

Я пытаюсь отформатировать строку, чтобы добавить запятые между группами из трех цифр.

EG:

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

Я пытаюсь понять, как это сделать с помощью DecimalFormat, до сих пор я использовал собственный сценарий, который кажется слишком сложным. Я не могу понять, как это сделать, использование # просто скрывает конечные нули, а использование 0 добавляет их к числу.

Это то, что я пытаюсь прямо сейчас:

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

Я уверен, что это должно быть легко, но я не уверен, как это сделать. Мне не нужно делать это с помощью DecimalFormat, я просто подумал, что это будет проще. Как я могу просто добавить запятые без какого-либо изменения десятичных знаков?


person lisovaccaro    schedule 10.03.2013    source источник


Ответы (5)


Вы должны использовать объект NumberFormat и настроить его на использование группировки. Что-то вроде

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));
         }

      }
   }
}

который возвращает:

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

Преимущество этого заключается в том, что решение может зависеть от локали.

Отредактировано
Теперь показан пример с объектом DecimalFormat. Обратите внимание, что вы должны установить размер группировки, если вы используете это.

person Hovercraft Full Of Eels    schedule 10.03.2013
comment
@a_horse_with_no_name: правда, он мог вызвать setGroupingUsed(true) для объекта DecimalFormat. - person Hovercraft Full Of Eels; 11.03.2013
comment
Я использовал код, хотя и с десятичным форматом. Однако он использует '.' вместо запятых для групп. Как я могу изменить его на «,» или Locale.US? - person lisovaccaro; 11.03.2013
comment
@ Liso22: да, решение зависит от локали. Убедитесь, что Locale вашего объекта NumberFormat или DecimalFormat установлен для региона, который использует запятые в качестве разделителя группировки. - person Hovercraft Full Of Eels; 11.03.2013
comment
Я только что попробовал. Все работает нормально, пока я не попробовал число с 4 десятичными знаками, и оно начинает округлять значения. Например: 1,1237 становится: 1,124. Знаете ли вы какое-либо решение этого? - person lisovaccaro; 11.03.2013
comment
Также я пробовал это `DecimalFormat otherDFormat = (DecimalFormat) otherFormat; другойDFormat.applyPattern(#.00); другойDFormat.setGroupingUsed(true); другойDFormat.setGroupingSize(3); resultStr = otherDFormat.format(Double.valueOf(1));` и возвращает 1,00 вместо 1 - person lisovaccaro; 11.03.2013
comment
@ Liso22: да, он вернет 1,00, потому что ваш формат говорит, что он должен возвращаться. Почему это не так? - person Hovercraft Full Of Eels; 11.03.2013

Вы также можете попробовать что-то вроде

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
person arshajii    schedule 10.03.2013
comment
Лучше звоните setGroupingUsed(true) и setGroupingSize(3) иначе ваше решение не будет работать для номеров › 999999.00. - person Hovercraft Full Of Eels; 11.03.2013
comment
@HovercraftFullOfEels, кажется, отлично работает для таких чисел, например. 9999999.00 -> 9,999,999.00. - person arshajii; 11.03.2013
comment
Я отказываюсь от того, что сказал. 1+ Это мой последний голос на сегодня. :( - person Hovercraft Full Of Eels; 11.03.2013

Вы должны быть в состоянии делать именно то, что хотите:

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);
person paulsm4    schedule 10.03.2013

Самое простое решение

Почему бы вам не использовать флаг запятая , с 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  

Результат будет

58,625
12,345,678.90

И хорошие новости: фактически сгенерированный разделитель использовал is specific to the user’s locale

person Basheer AL-MOMANI    schedule 08.02.2017

Я не мог заставить работать какие-либо другие решения, некоторые округляли десятичные дроби, некоторые добавляли конечные нули или некоторые удаляли конечные нули.

Я не планирую принимать свой собственный ответ, но я опубликую свой сценарий на случай, если кто-то сочтет его полезным.

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
person lisovaccaro    schedule 11.03.2013