2011-11-16 61 views
11
public class Divers { 
    public static void main(String args[]){ 

    String format = "|%1$-10s|%2$-10s|%3$-20s|\n"; 
    System.out.format(format, "FirstName", "Init.", "LastName"); 
    System.out.format(format, "Real", "", "Gagnon"); 
    System.out.format(format, "John", "D", "Doe"); 

    String ex[] = { "John", "F.", "Kennedy" }; 

    System.out.format(String.format(format, (Object[])ex)); 
    } 
} 

输出:如何使用String.format居中字符串?

|FirstName |Init.  |LastName   | 
|Real  |   |Gagnon    | 
|John  |D   |Doe     | 
|John  |F.  |Kennedy    | 

我要居中输出。如果我不使用' - '标志,则输出将对齐到右侧。

我没有找到在API中居中文本的标志。

This文章有一些关于格式的信息,但没有任何关于中心的理由。

+0

输出实际上是一个表,所以某些原因问题没有正确显示表。 – rana

+3

请参阅'StringUtils' [http://stackoverflow.com/questions/2709993/how-to-center-string-output-using-printf-and-variable-width-java](http://stackoverflow.com/questions/2709993/how-to-center-string-output-using-printf-and-variable-width-java)**或** [http://www.java2s.com/Code/Java/Data-Type/CentersaStringinalargerStringofsizesizeusingthe spacecharacter .htm](http://www.java2s.com/Code/Java/Data-Type/CentersaStringinalargerStringofsizesizeusingspacecharacter.htm) – ecle

+0

@eee是标准库中的StringUtils? – rana

回答

16

我很快破解了这个。您现在可以在String.format中使用StringUtils.center(String s, int size)

import static org.hamcrest.CoreMatchers.*; 
import static org.junit.Assert.assertThat; 

import org.junit.Test; 

public class TestCenter { 
    @Test 
    public void centersString() { 
     assertThat(StringUtils.center(null, 0), equalTo(null)); 
     assertThat(StringUtils.center("foo", 3), is("foo")); 
     assertThat(StringUtils.center("foo", -1), is("foo")); 
     assertThat(StringUtils.center("moon", 10), is(" moon ")); 
     assertThat(StringUtils.center("phone", 14, '*'), is("****phone*****")); 
     assertThat(StringUtils.center("India", 6, '-'), is("India-")); 
     assertThat(StringUtils.center("Eclipse IDE", 21, '*'), is("*****Eclipse IDE*****")); 
    } 

    @Test 
    public void worksWithFormat() { 
     String format = "|%1$-10s|%2$-10s|%3$-20s|\n"; 
     assertThat(String.format(format, StringUtils.center("FirstName", 10), StringUtils.center("Init.", 10), StringUtils.center("LastName", 20)), 
       is("|FirstName | Init. |  LastName  |\n")); 
    } 
} 

class StringUtils { 

    public static String center(String s, int size) { 
     return center(s, size, ' '); 
    } 

    public static String center(String s, int size, char pad) { 
     if (s == null || size <= s.length()) 
      return s; 

     StringBuilder sb = new StringBuilder(size); 
     for (int i = 0; i < (size - s.length())/2; i++) { 
      sb.append(pad); 
     } 
     sb.append(s); 
     while (sb.length() < size) { 
      sb.append(pad); 
     } 
     return sb.toString(); 
    } 
} 
+0

谢谢你的答案; – rana

+1

我会坚持从apache commons lang的StringUtils,因为它很容易整合,使用maven – rana

+0

@rana,好主意! –

4

下面是使用apache commons lang StringUtils的答案。

请注意,您必须将jar文件添加到构建路径。如果您使用的是maven,请确保在依赖关系中添加commons lang。

import org.apache.commons.lang.StringUtils; 
public class Divers { 
    public static void main(String args[]){ 

    String format = "|%1$-10s|%2$-10s|%3$-20s|\n"; 
    System.out.format(format, "FirstName", "Init.", "LastName"); 
    System.out.format(format,StringUtils.center("Real",10),StringUtils.center("",10),StringUtils.center("Gagnon",20); 

    System.out.format(String.format(format, (Object[])ex)); 
    } 
} 
+1

这个答案它更合适,因为使用一个知名的图书馆为此目的 –

+1

约定@PauloOliveira –

12
public static String center(String text, int len){ 
    String out = String.format("%"+len+"s%s%"+len+"s", "",text,""); 
    float mid = (out.length()/2); 
    float start = mid - (len/2); 
    float end = start + len; 
    return out.substring((int)start, (int)end); 
} 

public static void main(String[] args) throws Exception{ 
    // Test 
    String s = "abcdefghijklmnopqrstuvwxyz"; 
    for (int i = 1; i < 200;i++){ 
     for (int j = 1; j < s.length();j++){ 
      center(s.substring(0, j),i); 
     } 
    } 
} 
+2

很好的答案!可能要考虑使您的方法名称小写,大写使它看起来像是一个类而不是一个方法。 –

0

这里是我是如何在Java中办理了定心列标题的例子:

public class Test { 
    public static void main(String[] args) { 
     String[] months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", 
       "October", "November", "December" }; 

     // Find length of longest months value. 
     int maxLengthMonth = 0; 
     boolean firstValue = true; 
     for (String month : months) { 
      maxLengthMonth = (firstValue) ? month.length() : Math.max(maxLengthMonth, month.length()); 
      firstValue = false; 
     } 

     // Display months in column header row 
     for (String month : months) { 
      StringBuilder columnHeader = new StringBuilder(month); 
      // Add space to front or back of columnHeader 
      boolean addAtEnd = true; 
      while (columnHeader.length() < maxLengthMonth) { 
       if (addAtEnd) { 
        columnHeader.append(" "); 
        addAtEnd = false; 
       } else { 
        columnHeader.insert(0, " "); 
        addAtEnd = true; 
       } 
      } 
      // Display column header with two extra leading spaces for each 
      // column 
      String format = " %" + Integer.toString(maxLengthMonth) + "s"; 
      System.out.printf(format, columnHeader); 
     } 
     System.out.println(); 

     // Display 10 rows of random numbers 
     for (int i = 0; i < 10; i++) { 
      for (String month : months) { 
       double randomValue = Math.random() * 999999; 
       String format = " %" + Integer.toString(maxLengthMonth) + ".2f"; 
       System.out.printf(format, randomValue); 
      } 
      System.out.println(); 
     } 
    } 
} 
0

我与Mertuarez的上述优雅答案玩弄和决定后我的版本。

public class CenterString { 

    public static String center(String text, int len){ 
     if (len <= text.length()) 
      return text.substring(0, len); 
     int before = (len - text.length())/2; 
     if (before == 0) 
      return String.format("%-" + len + "s", text); 
     int rest = len - before; 
     return String.format("%" + before + "s%-" + rest + "s", "", text); 
    } 

    // Test 
    public static void main(String[] args) { 
     String s = "abcde"; 
     for (int i = 1; i < 10; i++){ 
      int max = Math.min(i, s.length()); 
      for (int j = 1; j <= max; j++){ 
       System.out.println(center(s.substring(0, j), i) + "|"); 
      } 
     } 
    } 
} 

输出:

a| 
a | 
ab| 
a | 
ab | 
abc| 
a | 
ab | 
abc | 
abcd| 
    a | 
ab | 
abc | 
abcd | 
abcde| 
    a | 
    ab | 
abc | 
abcd | 
abcde | 
    a | 
    ab | 
    abc | 
abcd | 
abcde | 
    a | 
    ab | 
    abc | 
    abcd | 
abcde | 
    a | 
    ab | 
    abc | 
    abcd | 
    abcde | 

从Mertuarez的代码实际差别:

  1. 矿做数学的前期,使一次性最终居中字符串,而不是做一个too-长字符串,然后从中取出一个子字符串。我认为这是更高性能,但我没有测试它。
  2. 对于不能完全居中的文本,我始终把它放在左边半个字符,而不是把它放在右半边的一半。
  3. 对于长度超过指定长度的文本,我始终返回指定长度的子字符串,该子字符串位于原始文本的开头。
相关问题