String.format () для форматирования double в Java

179

Как я могу использовать String.format (формат String, X) для форматирования двойной, как следует ???

2354548,235 -> 2 354 548,23

Спасибо!

подглядывать
источник

Ответы:

295
String.format("%1$,.2f", myDouble);

String.format автоматически использует локаль по умолчанию.

Дэвид Тан
источник
36
Вы также можете использовать конкретную локаль с помощьюString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire
13
Если для форматирования используется более одного двойного числа, используйте% 1,% 2 и т. Д. Например, String.format («% 1 $,. 2f,% 2 $,. 2f», myDouble, aDouble)
Moesio
4
Я считаю, что «% 1 $» является необязательным в этом случае. У меня работает только "%, 2f" в формате String.
Мэтт Пасселл
5
Да, Мэтт прав. %1, %2и так далее, можно использовать для переупорядочения вывода на основе индекса ваших входных аргументов. Смотрите это . Вы можете опустить индекс и порядок по умолчанию будет принят форматером.
praneetloke
1
Вы должны дать объяснение, что означают различные части.
Митулат Бати
41
String.format("%4.3f" , x) ;

Это означает, что нам нужно всего 4 цифры в ANS, из которых 3 должны быть после десятичной. И f это спецификатор формата double. х означает переменную, для которой мы хотим ее найти. Работал на меня. , ,

user3304797
источник
1
Я думаю, это означает, что это будет четвертая переменная в аргументах, которые следуют и будут иметь 3 знака после запятой.
Майкл Фултон
@MichaelFulton Это не так просто: String.format("%014.3f" , 58.656565)-> 0000000058,657: всего 14 символов: 8 нулей, 5 чисел и 1 запятая. Таким образом, в этом случае число 14 означает общее количество символов (лишние заменяются на ведущий ноль, могут обойтись без, затем оно будет заменено пробелом) в строке результата . .3Часть полностью независим здесь.
парсер
Однако здесь: String.format("%014.3f" , 58.656565)-> 58,657. Я беру это, потому что предпочтение переходит к .3fчасти: сначала она печатает число с 3 десятичными знаками, а после, если остаются символы, она печатает начальные пробелы (или нули / что угодно). В этом случае число составляет 2 + 3 + 1 = 6 символов, и мы хотели только напечатать 4, поэтому, конечно, лишних пробелов нет.
парсер
24

Если вы хотите отформатировать его с помощью установленных вручную символов, используйте это:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

Хотя форматирование на основе локали предпочтительнее.

mdrg
источник
3
Полезный ответ! Однако последнее предложение «Форматирование на основе локали предпочтительнее» не имеет смысла без контекста. Есть довольно хорошие случаи использования, когда вам НЕ следует использовать форматирование на основе локали, когда вы хотите сгенерировать определенный формат строки. Например, вы осуществляете экспорт своих данных во внешний файл и хотите иметь полный контроль над форматом, независимо от текущей (или какой-либо) локали.
Хонза Зидек
20

код извлечен из этой ссылки ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

Выходные данные из этого примера показывают, как формат одного и того же числа меняется в зависимости от локали:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US
Gursel Koca
источник
13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

И распечатать:

3 (3) +3 00003
Формат
с
плавающей точкой по умолчанию: 1234567,123000 С плавающей точкой с запятыми: 1.234.567,123000 Отрицательное значение с плавающей точкой по умолчанию: -1.234.567,123000
Отрицательный параметр с плавающей точкой: (1.234.567, 123000)


Состав положительных и отрицательных значений: 1.234.567,12
-1.234.567,12

Торрес
источник
2

Есть много способов сделать это. Те приведены ниже:

Предположим, ваш оригинальный номер указан ниже: double number = 2354548.235;

Использование NumberFormatи режим округления

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Использование строкового форматера

System.out.println(String.format("%1$,.2f", number));

Во всех случаях вывод будет: 2354548.24

Примечание :

Во время округления вы можете добавить RoundingModeв свой форматер. Вот несколько режимов округления, приведенных ниже:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Вот импорт :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
Г-н Саджедул Карим
источник
1

использование DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
Анисуззаман Бабла
источник