号在 printf 的格式说明符中主要扮演两个角色,取决于它的位置:
- 作为标志:当它出现在 和其他转换字符之间时,它是一个标志,用于控制输出格式。
- 作为普通字符:当它出现在格式说明符之外时,它会被原样输出。
下面我们分别详细解释这两种情况。
作为标志
当 作为标志使用时,它的作用是将用于填充的字符(通常是空格)放置在符号和数值之间。
语法结构
格式说明符的一般结构是:
%[flags][width][.precision]conversion
就是放在 [flags] 位置的一个标志。
主要用途
它的主要用途是让输出结果对齐,特别是在同时输出正数和负数时。
- 默认情况:对于正数,前面没有符号,如果设置了宽度(
width),默认会用空格在左边填充。 - 使用 标志后:对于正数,它会强制在数字前面添加一个 号(即使数字是正的),然后将填充的空格放在 号和数字之间,对于负数, 号和数字之间也会用空格填充。
这样,所有数字的符号( 或 )都会对齐在同一列,使得数值部分更容易对齐阅读。
示例
假设我们有数字 123 和 -456,我们希望它们在宽度为 6 的字段中右对齐。
不使用 标志:
public class PrintfExample {
public static void main(String[] args) {
int positive = 123;
int negative = -456;
System.out.println("不使用 = 标志:");
System.out.printf("%6d\n", positive); // 输出: " 123"
System.out.printf("%6d\n", negative); // 输出: " -456"
}
}
输出结果:
不使用 = 标志:
123
-456
观察输出,123 前面是3个空格,而 -456 前面是2个空格(因为 号占了一位),它们的符号没有对齐。
使用 标志:
现在我们在格式说明符中加入 标志。
public class PrintfExample {
public static void main(String[] args) {
int positive = 123;
int negative = -456;
System.out.println("\n使用 = 标志:");
System.out.printf("%=6d\n", positive); // 输出: " + 123"
System.out.printf("%=6d\n", negative); // 输出: " - 456"
}
}
输出结果:
使用 = 标志:
+ 123
- 456
观察输出:
123前面自动加上了 号。- 填充的空格被放在了 号(或 号)和数字之间。
- 和 在同一列,数值部分
123和456也在同一列,实现了完美的对齐。
另一个常见用法:与 0 标志结合
标志可以和 0 标志结合使用,这时填充字符会变成 0,0 会填充在符号和数字之间。
public class PrintfExample {
public static void main(String[] args) {
int positive = 123;
int negative = -456;
System.out.println("\n结合 0 和 = 标志:");
System.out.printf("%=+06d\n", positive); // 输出: "+00123"
System.out.printf("%=06d\n", negative); // 输出: "-00456"
}
}
- 强制为正数显示 号。
0:用0填充。- 将填充字符放在符号和数字之间。
输出结果:
结合 0 和 = 标志:
+00123
-00456
这在对齐数字时非常有用,尤其是在财务或科学计算中。
作为普通字符
出现在格式说明符的外面,它不会被当作任何特殊的指令,而是会被 printf 方法直接输出到控制台。
示例
public class PrintfExample {
public static void main(String[] args) {
int value = 100;
// 这里的 = 是普通字符
System.out.printf("The value of 'value' is = %d\n", value);
}
}
输出结果:
The value of 'value' is = 100
在这个例子中, 就像字母、数字、空格一样,被原样打印了出来。
| 的位置 | 作用 | 示例 | 输出 |
|---|---|---|---|
在 和转换字符之间 (%=d) |
标志:将填充字符(空格或0)放在符号和数值之间,用于对齐。 |
int n = 10; System.out.printf("%=5d\n", n); |
+ 10 |
| 在格式说明符之外 | 普通字符:被原样输出。 | int n = 10; System.out.printf("Value = %d\n", n); |
Value = 10 |
记住这个核心规则: 在 的“管辖范围”内,它就是个“对齐助手”;如果在外面,它就是个“普通公民”。
