Java:String.format 不起作用 'f != [F'



我尝试使用String.format格式化一些浮动。

如果我这样做:

public class TestClass {
public static void main(String[] args) {
System.out.println(String.format("%5.2f %5.2f", 2.35792f, 8.9479f));
}
}

然后它似乎工作并打印出2.36 8.95

然而,如果我将其提取到一种方法:

public class TestClass {
public static void main(String[] args) {
System.out.println(formatFloats(2.35792f, 8.9479f));
}
private static String formatFloats(float...fs) {
StringBuilder formatStr = new StringBuilder();
for (float v: fs) {
formatStr.append("%5.2f ");
}
return String.format(formatStr.toString().trim(), fs);
}
}

然后它会引发一个异常:

Exception in thread "main" java.util.IllegalFormatConversionException: f != [F
at java.base/java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4426)
at java.base/java.util.Formatter$FormatSpecifier.printFloat(Formatter.java:2951)
at java.base/java.util.Formatter$FormatSpecifier.print(Formatter.java:2898)
at java.base/java.util.Formatter.format(Formatter.java:2673)
at java.base/java.util.Formatter.format(Formatter.java:2609)
at java.base/java.lang.String.format(String.java:3292)
at demo.vec3.TestClass.formatFloats(TestClass.java:12)
at demo.vec3.TestClass.main(TestClass.java:4)

我试图打印formatStr.toString().trim(),但它确实输出了%5.2f %5.2f

错误消息很神秘,我根本不明白它的意思。我相信这与我如何使用float...fs有关。

(我正在使用EclipseIDE编写和运行我的应用程序。(


备注:事实证明,如果我将函数代码稍微更改为:

private static String formatFloats(Object...fs) {
StringBuilder formatStr = new StringBuilder();
for (Object v: fs) {
formatStr.append("%5.2f ");
}
return String.format(formatStr.toString().trim(), fs);
}

然后工作,再次输出2.36 8.95

你是对的。当您传入float[]时,Java认为您正试图打印一个参数,一个float[],而不是数组的所有单个浮点元素。只有Object[]String.format使用的变容器兼容,允许将每个单独的浮点解释为单独的format自变量。

请注意,Float[]也将工作,因为Float[]可以上变频到Object[],但float[]不能。

您可以使用formatFloats()方法的第一个格式副本,您只需要在StringBuilder append中进行格式化,例如:

private static String formatFloats(float... fs) {
StringBuilder formatStr = new StringBuilder("");
for (float v: fs) {
formatStr.append(String.format("%-6.2f ", v));
}
return formatStr.toString();
}

最新更新