2017-07-07 18 views
0
设置宽度和垫整witdth字符串格式化

鉴于我有以下的整数:如何在Java中

1, 10, 100 

我想垫他们与零有3码:

001 
010 
100 

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

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

我想要t o使用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%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 

从而使间距是可变的

+1

正在打印的所有数<= 999?如果是这样的话,你可以用固定的10个空格字符串作为前缀... –

+0

你想用@空格填充长度为10的空格,还是只需在@Jiri建议的前面添加10个空格? –

+0

@TimBiegeleisen请参阅我的编辑 –

回答

3

如果两个唯一指标分析10个空格和数字的零填充的填充:从OP更新后

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

编辑:

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

工作原理:

我们需要两个参数用于我们的模式,一个用于长度为10的字符串,另一个用于整数。我们添加-%-10s。第二个参数是我们想要填充的长度为3的整数零:%03d

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

+1

现货!非常感谢。根据我对格式化程序字符串语法的理解,它看起来像是一起使用了2个格式化程序字符串?所以'-'把它左对齐到字符串的开头,而不是像我想的那样是前一个字符。 –

+0

实际上再看一遍,我不确定它是如何工作的。你能简单解释一下吗?它看起来像是将宽度设置为字符串('%-10s')而不是整数。你也不需要使用'argument_index $'指向每个参数吗? –

+0

我已添加一些说明。是的,宽度是为字符串和整数单独设置的。 – msfoster

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