31

我想根据用户输入改变我正在格式化的字符串中双精度表示的精度。现在我正在尝试类似的东西:

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

但是我收到一个java.util.UnknownFormatConversionException. 我对这种方法的灵感来自 C printf 和这个资源(第 1.3.1 节)。

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

编辑:

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

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

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

4

4 回答 4

17

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

如果您想要一个占用 8 个总字符(包括小数点)的格式化小数,并且您想要小数点后 4 个数字,那么您的格式字符串应类似于“%8.4f”...

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

于 2010-02-20T04:39:39.150 回答
8

您可以使用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)
于 2016-06-30T11:55:53.653 回答
4

为什么不 :

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);
}
于 2016-06-30T11:49:30.183 回答
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

于 2021-01-21T14:11:22.000 回答