Как Java String.format с переменной точностью?
Я хотел бы изменить точность двойного представления в строке, которую я форматировал на основе ввода пользователем. Прямо сейчас я пытаюсь что-то вроде:
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);
но меня все равно интересовала встроенная поддержка такой операции.
Ответы
Ответ 1
Вы сами ответили на свой вопрос - стройте свою строку формата динамически... строки действительного формата следуйте приведенным здесь соглашениям: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax.
Если вы хотите отформатированный десятичный знак, который занимает 8 общих символов (включая десятичную точку) и вам нужно 4 цифры после десятичной точки, ваша строка формата должна выглядеть как "% 8.4f"...
Насколько я знаю, в Java нет "родной поддержки", за исключением того, что строки формата являются гибкими.
Ответ 2
Вы можете использовать класс 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
Почему бы и нет:
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);
}