Java 同时设置字段填充长度和小数精度

Java 同时设置字段填充长度和小数精度,java,format,Java,Format,是否可以在设置小数精度的同一行中设置字段填充的长度?我希望firstPlaceTime以3个小数点显示,比如8.250而不是8.25。可能类似于%8s%3f或%8s.3f System.out.format("%-10s%1s%-18s%1s%8s%1s%16s%-10s","Level " + level, "| ", firstPlaceName, "| ", firstPlaceTime + "s

是否可以在设置小数精度的同一行中设置字段填充的长度?我希望
firstPlaceTime
以3个小数点显示,比如8.250而不是8.25。可能类似于
%8s%3f
%8s.3f

System.out.format("%-10s%1s%-18s%1s%8s%1s%16s%-10s","Level " + level,  "| ", firstPlaceName, "| ", firstPlaceTime + "s ", "|", timeGain + "s ahead |", " " + numberOfRunners + " runners");

此代码显示了一种构建格式字符串的方法,以及使用
%8.3f
显示双精度文本的方法

public static void main(String[] args)
{
    String level = "Beginning";
    String firstPlaceName = "TheWinner!";
    double firstPlaceTime = 180.234534D;
    double timeGain = 10.2D;
    int numberOfRunners = 10;

    StringBuilder sb = new StringBuilder();
    sb.append("Level %-10s"); //the level
    sb.append("|"); //divider
    sb.append("%-18s"); //name of winner
    sb.append("|"); //divider
    sb.append("%8.3f s "); //winning time
    sb.append("|"); //divider
    sb.append("%8.3f s ahead"); //time gain
    sb.append("|"); //divider
    sb.append("%5d runners"); // # of runners

    System.out.format(sb.toString(),
            level,
            firstPlaceName,
            firstPlaceTime,
            timeGain,
            numberOfRunners);

}
输出:

Level Beginning |TheWinner!        | 180.235 s |  10.200 s ahead|   10 runners
编辑:详细说明评论中的问题。OP表示有人试图使用
%8.3f
,并收到一个格式错误
firstPlaceTime
是双精度编码。但是,参数指定为:

...,firstPlaceTime + "s ",...
+“s”
作为参数提供时,它将被转换为
字符串
,然后传递给
.format()
。作为
字符串
,通过
%8.3f
规范进行格式化将不会是
双重
。这是建议将文本移动到格式规范中而不是尝试的部分原因
参数中的各种字符串连接。

是否
firstPlaceTime
已经是字符串?在这种情况下,您需要在将其传递到
.format
之前对其进行格式化。如果它是一个
double
(或
float
),那么您可以使用
%8.3f
。旁白:为什么要将格式与字符串串联混合?只需将分隔符和文本放在格式本身中。@KevinO
firstPlaceTime
是双精度的。我尝试使用
%8.3f
,但它抛出错误IllegalFormatConversion。我不熟悉在格式中添加分隔符和文本。这似乎是一种更好的格式,谢谢你给我展示。只是好奇,为什么
8.3f
在我的原始版本中不起作用呢?@JoshCorreia,请看答案中的详细说明。但基本上,通过指定
firstPlaceTime+“s”
,该参数成为
字符串,不再是双精度参数。