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

Formatting java strings with system.out.printf

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

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

601 GoPro Hero5 Black       276.95
602 GoPro Hero5 Session     199.00
611 Canon EOS Rebel         361.89

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

601 GoPro Hero5 Black     276.95
602 GoPro Hero5 Session     199.00
611 Canon EOS Rebel     361.89

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

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

我认为“-1s”左对齐表示减号,1 将是第一个和第二个输入之间的 space,那么 %10s 将相隔十个字符,%10.2 将是十个除了 2 位小数。所以我试着做

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

但这仍然无法使第三个值相互内联。


修改尝试使用

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

结果...

601        GoPro Hero5 Black     276.95
602        GoPro Hero5 Session     199.00
611        Canon EOS Rebel     361.89

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

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

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

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

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

您可能正在寻找更像

的东西
%-4s%-25s%6.2f

这意味着:

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

您可以将 %4s 替换为 %3s<space> 以获得类似的效果。区别在于如何处理溢出。第一个版本在第一列中的长度超过 3 个字符的值后面没有 space。第二个会。