使用 system.out.printf 格式化 java 字符串

5 java printf system.out output

我一直在寻找很多关于 java 中用于格式化字符串输出的 System.out.printf 的问题,但我似乎不明白如何使用它。

我正在尝试打印看起来像这样的漂亮列

601 GoPro Hero5 Black       276.95
602 GoPro Hero5 Session     199.00
611 Canon EOS Rebel         361.89
Run Code Online (Sandbox Code Playgroud)

但我能得到的最好的就是这个

601 GoPro Hero5 Black     276.95
602 GoPro Hero5 Session     199.00
611 Canon EOS Rebel     361.89
Run Code Online (Sandbox Code Playgroud)

我似乎能够对齐前两个值,但不能对齐第三个值。这是我的代码

System.out.printf("%-1s %10s %10.2f\n", "ex string", "ex string", 276.95);
Run Code Online (Sandbox Code Playgroud)

我认为“-1s”是左对齐的减号,1 将是第一个和第二个输入之间的空格,然后 %10s 将相隔十个字符,%10.2 将相隔十个并保留 2 个小数位。所以我试着做

System.out.printf("%-1s %10s %20.2f\n", "ex string", "ex string", 276.95);
Run Code Online (Sandbox Code Playgroud)

但这仍然没有使第三个值相互一致。


修改尝试使用

System.out.printf("%-10s %-10s %10.2f\n", "ex string", "ex string", 276.95);
Run Code Online (Sandbox Code Playgroud)

结果是...

601        GoPro Hero5 Black     276.95
602        GoPro Hero5 Session     199.00
611        Canon EOS Rebel     361.89
Run Code Online (Sandbox Code Playgroud)

为了记录我的代码正在获取这样的变量:

System.out.printf("%-10s %-10s %10.2f\n", items.get(i).getItemNumber(), items.get(i).getName(), items.get(i).getPrice());
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 5

字段宽度说明符不是间距说明。

%-1表示在字段中左对齐至少一个字符宽。但是您的第一列始终至少有 3 个字符宽,因此会忽略说明符。纯粹出于巧合,第一列看起来很整齐:您的所有数字碰巧都有三位数。

相似地, %10表示在至少 10 个字符宽的字段中右对齐。但是您所有的相机名称都比这长得多,因此实际上忽略了说明符。

您可能正在寻找更像的东西

%-4s%-25s%6.2f
Run Code Online (Sandbox Code Playgroud)

这意味着:

  1. 将字段中的第一个参数左对齐至少 4 个字符宽
  2. 将字段中的第二个参数左对齐至少 25 个字符宽
  3. 在至少 6 个字符宽的字段中打印右对齐的数字,小数点后有两位数字

你可以替换%4s使用%3s<space>了类似的效果。不同之处在于溢出的处理方式。第一个版本在第一列中长度超过 3 个字符的值后面没有空格。第二个会。