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. х означает переменную, для которой мы хотим ее найти. Работал на меня. , ,


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

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


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

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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.