如何在 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, " "));