Как использовать Java String.format с переменной точностью? - PullRequest
23 голосов
/ 20 февраля 2010

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

String foo = String.format("%.*f\n", precision, my_double);

однако я получаю java.util.UnknownFormatConversionException. Мое вдохновение для этого подхода было C printf и этот ресурс (раздел 1.3.1).

У меня где-нибудь есть простая синтаксическая ошибка, поддерживает ли Java этот случай или есть лучший подход?

Edit:

Полагаю, я мог бы сделать что-то вроде:

String foo = String.format("%." + precision + "f\n", my_double);

но я все равно был бы заинтересован в нативной поддержке такой операции.

Ответы [ 3 ]

18 голосов
/ 20 февраля 2010

Вы как бы ответили на свой вопрос - динамически создавайте строку формата ... допустимые строки формата следуют соглашениям, изложенным здесь: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax.

Если вы хотите отформатированный десятичный знак, который занимает всего 8 символов (включая десятичную точку), и вам нужно 4 цифры после десятичной точки, ваша строка формата должна выглядеть как "% 8.4f" ...

Насколько мне известно, в Java нет "нативной поддержки", кроме строковых форматов.

5 голосов
/ 30 июня 2016

Вы можете использовать класс DecimalFormat .

double d1 = 3.14159;
double d2 = 1.235;

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

double roundedD1 = df.format(d); // 3.14
double roundedD2 = df.format(d); // 1.24

Если вы хотите установить точность во время выполнения, позвоните:

df.setMaximumFractionDigits(precision)
3 голосов
/ 30 июня 2016

Почему бы и нет:

String form = "%."+precision+"f\n";
String foo = String.format(form, my_double);

или:

public static String myFormat(String src, int precision, Object args...)
{
    String form = "%."+precision+"f\n";
    return String.format(form, args);
}
...