如何在Java中使用String Formatter设置宽度和填充整数

时间:2017-07-07 07:23:20

标签: java string string-formatting

鉴于我有以下整数:

1, 10, 100

我想用零填充它们以正好有3位数字:

001
010
100

我想打印前缀为10个空格:

      001 //assume 10 spaces from the beginning of the line 
      010
      100

我想使用Java formatter string来完成此操作,但我只是成功完成上述提及条件之一,但不能同时完成

以下是我创建的两个表达式,可以完成以下每个条件:

    @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%2$14s%3$03d\n", s, " ", n);
        }

    }

根据文档,格式化程序字符串具有以下形式:

%[argument_index$][flags][width][.precision]conversion

但显然零填充标志参数不能跟随宽度参数,因为它被解析为一个数字,导致“长宽度”。

如何改写以完成上述条件?

注意

我唯一的想法是明确地向参数添加一个空格并尝试将其作为参数进行操作。像这样:

System.out.printf("%1$s%2$10s%3$03d\n", s, " ", n);

修改

道歉,我才意识到我没有完全描述我的问题。这些数字需要遵循某些不同长度的其他字符串,如下所示:

textX       001
textXXX     010
textXX      100

这样间距可变

2 个答案:

答案 0 :(得分:3)

如果两个唯一的标准是10个空格的填充和数字的零填充:

final String str = String.format("%10s%03d", " ", 2);

从OP更新后编辑:

 System.out.printf("%-10s%03d", "abc", 2);

工作原理:

我们的模式需要两个参数,一个用于长度为10的字符串,另一个用于整数。

%10s是长度为10的字符串的模式。为了保持对齐,我们添加了-%-10s。第二个参数是长度为3的整数,我们希望左边的填充为零:%03d

如果我们不想重新排列或重用多个格式说明符的参数,只需按照模式中指定的顺序传递参数。

答案 1 :(得分:0)

此答案基于您的最新编辑,其中显示了此数据:

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