如何在 Java 中使用字符串格式化程序设置宽度和填充整数
How to set width AND pad integer witdth String Formatter in Java
鉴于我有以下整数:
1, 10, 100
我想用零填充它们以正好有 3 个数字:
001
010
100
和 我想打印它们前缀为 10 spaces:
001 //assume 10 spaces from the beginning of the line
010
100
我想使用 Java formatter string 来完成这个,但我只成功地完成了 上述条件之一,而不是同时完成 。
下面是我创建的 2 个表达式,它们满足每一个条件:
@Test
public void test1() {
String[] langs = { "TEXTX", "TEXTXXX", "TEXTXX" };
int[] nums = {1, 10, 100};
for (int i = 0; i < 3; i++) {
String s = langs[i];
int n = nums[i];
System.out.printf("%1$s%2s%3d\n", s, " ", n);
}
}
根据文档,格式化程序字符串具有以下形式:
%[argument_index$][flags][width][.precision]conversion
但显然零填充标志参数后面不能跟宽度参数,因为它被解析为一个数字,导致 "long width"。
如何重写才能满足上述条件?
注意:
我唯一的想法是在参数中显式添加一个 space 并尝试将其作为参数进行操作。像这样:
System.out.printf("%1$s%2s%3d\n", s, " ", n);
编辑:
抱歉,我刚刚意识到我没有完整描述我的问题。这些数字需要跟在某些其他不同长度的字符串之后,像这样:
textX 001
textXXX 010
textXX 100
因此间距可变。
如果唯一的两个标准是 10 个空格的填充和数字的零填充:
final String str = String.format("%10s%03d", " ", 2);
从 OP 更新后编辑:
System.out.printf("%-10s%03d", "abc", 2);
工作原理:
我们的模式需要两个参数,一个用于长度为 10 的字符串,一个用于整数。
%10s
是长度为 10 的字符串的模式。为了左对齐,我们添加 -
:%-10s
。第二个参数是长度为 3
的整数,我们要用零填充:%03d
.
如果我们不想为多个格式说明符重新排列或重用一个参数,只需按照模式中指定的顺序传递参数即可。
此答案基于您最近的编辑,其中显示了以下数据:
textX 001
textXXX 010
textXX 100
假设第二列的宽度始终为 3,那么您的问题将归结为确定在第一文本列之后需要添加多少空格。以下是在 Java 7:
中如何做到这一点
String text = "textXXX";
int n = 10 - text.length();
String padding = String.format("%0" + n + "d", 0).replace("0", " ");
在 Java 8 中,您可以这样获取填充字符串:
String padding = String.join("", Collections.nCopies(n, " "));
鉴于我有以下整数:
1, 10, 100
我想用零填充它们以正好有 3 个数字:
001
010
100
和 我想打印它们前缀为 10 spaces:
001 //assume 10 spaces from the beginning of the line
010
100
我想使用 Java formatter string 来完成这个,但我只成功地完成了 上述条件之一,而不是同时完成 。
下面是我创建的 2 个表达式,它们满足每一个条件:
@Test
public void test1() {
String[] langs = { "TEXTX", "TEXTXXX", "TEXTXX" };
int[] nums = {1, 10, 100};
for (int i = 0; i < 3; i++) {
String s = langs[i];
int n = nums[i];
System.out.printf("%1$s%2s%3d\n", s, " ", n);
}
}
根据文档,格式化程序字符串具有以下形式:
%[argument_index$][flags][width][.precision]conversion
但显然零填充标志参数后面不能跟宽度参数,因为它被解析为一个数字,导致 "long width"。
如何重写才能满足上述条件?
注意:
我唯一的想法是在参数中显式添加一个 space 并尝试将其作为参数进行操作。像这样:
System.out.printf("%1$s%2s%3d\n", s, " ", n);
编辑:
抱歉,我刚刚意识到我没有完整描述我的问题。这些数字需要跟在某些其他不同长度的字符串之后,像这样:
textX 001
textXXX 010
textXX 100
因此间距可变。
如果唯一的两个标准是 10 个空格的填充和数字的零填充:
final String str = String.format("%10s%03d", " ", 2);
从 OP 更新后编辑:
System.out.printf("%-10s%03d", "abc", 2);
工作原理:
我们的模式需要两个参数,一个用于长度为 10 的字符串,一个用于整数。
%10s
是长度为 10 的字符串的模式。为了左对齐,我们添加 -
:%-10s
。第二个参数是长度为 3
的整数,我们要用零填充:%03d
.
如果我们不想为多个格式说明符重新排列或重用一个参数,只需按照模式中指定的顺序传递参数即可。
此答案基于您最近的编辑,其中显示了以下数据:
textX 001
textXXX 010
textXX 100
假设第二列的宽度始终为 3,那么您的问题将归结为确定在第一文本列之后需要添加多少空格。以下是在 Java 7:
中如何做到这一点String text = "textXXX";
int n = 10 - text.length();
String padding = String.format("%0" + n + "d", 0).replace("0", " ");
在 Java 8 中,您可以这样获取填充字符串:
String padding = String.join("", Collections.nCopies(n, " "));