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

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)); } } 

输出:

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

我希望输出居中。 如果我不使用’ – ‘标志,则输出将与右侧对齐。

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

本文提供了一些有关格式的信息,但没有任何关于中心的理由。

我很快就把它搞砸了。 您现在可以在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(); } } 
 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); } } } 

这是使用apache commons lang StringUtils的答案。

请注意,您必须将jar文件添加到构建路径。 如果您正在使用maven,请确保在依赖项中添加公共语言。

 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)); } } 

这是我如何处理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(); } } } 

我正在玩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. 我在前面进行数学计算,并在一次拍摄中制作最终的居中字符串,而不是制作太长的字符串,然后从中获取子字符串。 我认为这稍微高一点,但我没有测试它。
  2. 对于无法完美居中的文本,我一直将它放在左边的半个字符上,而不是将它放在半个字符的右半部分。
  3. 对于长度超过指定长度的文本,我会始终返回指定长度的子字符串,该子字符串以原始文本的开头为根。

将https://www.leveluplunch.com/java/examples/center-justify-string/中的代码转换为方便的小型单行函数:

 public static String centerString (int width, String s) { return String.format("%-" + width + "s", String.format("%" + (s.length() + (width - s.length()) / 2) + "s", s)); } 

用法:

 public static void main(String[] args){ String out = centerString(10, "afgb"); System.out.println(out); //Prints " afgb " } 

我认为这是一个非常巧妙的解决方案,值得一提。