如何使用可变精度的Java String.format?

时间:2010-02-20 04:26:12

标签: java string rounding precision floating-accuracy

我想根据用户输入改变字符串中双重表示的精度。现在我正在尝试这样的事情:

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

然而我收到java.util.UnknownFormatConversionException。我对这种方法的启发是C printf和this resource(第1.3.1节)。

我在某处有一个简单的语法错误,Java支持这种情况,还是有更好的方法?

修改

我想我可以做类似的事情:

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

但我仍然对这种操作的原生支持感兴趣。

4 个答案:

答案 0 :(得分:18)

您回答了自己的问题 - 动态构建格式字符串...有效格式字符串遵循此处列出的约定:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax

如果你想要一个占用8个字符(包括小数点)的格式化小数,并且你想要小数点后的4位数,你的格式字符串应该看起来像“%8.4f”......

据我所知,除了格式字符串灵活外,Java中没有“原生支持”。

答案 1 :(得分:5)

您可以使用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)

答案 2 :(得分: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);
}

答案 3 :(得分:0)

double pi = Math.PI; // 3.141592653589793
int n = 5;
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(n);
System.out.printf(df.format(pi)); // 3.14159

您可以在运行时设置 n 的值。这里从上面给出的代码 n = 5 将打印 3.14159