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

ran*_*ana 15 java string format string-formatting

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));
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

|FirstName |Init.     |LastName            |
|Real      |          |Gagnon              |
|John      |D         |Doe                 |
|John      |F.        |Kennedy             |
Run Code Online (Sandbox Code Playgroud)

我希望输出居中.如果我不使用' - '标志,则输出将与右侧对齐.

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

文章有关于格式的一些信息,但没有对中心自圆其说.

Sah*_*hoo 18

我很快就把它搞砸了.你现在可以使用StringUtils.center(String s, int size)String.format.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Mer*_*rez 14

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!可能要考虑使你的方法名称小写,大写使它看起来像是一个类而不是一个方法. (2认同)

ran*_*ana 7

这是使用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));
  }
}
Run Code Online (Sandbox Code Playgroud)


epo*_*pox 7

int spaceSize = n - s.length();\nint prefixSize = spaceSize / 2;\nint suffixSize = (spaceSize + 1) / 2\n
Run Code Online (Sandbox Code Playgroud)\n

从 Java 11 开始“one-liner”

\n
return n > s.length()\n     ? " ".repeat(prefixSize) + s + " ".repeat(suffixSize)\n     : s;\n
Run Code Online (Sandbox Code Playgroud)\n

将上述变量内联到一个返回中,我们可以得到:

\n
\n

returnn > s.length()\n ? " ".repeat( (n - s.length() ) / 2) + s + " ".repeat( (n - s.length() + 1) / 2**)** \n: s;

\n
\n
\n

从 Java 8 开始

\n

Java 8 没有" ".repeat(10)方法。所以

\n
    \n
  • 只需将其替换" ".repeat(10)为 Java 8 模拟即可。请参阅/sf/answers/4026022311/,以及

    \n
  • \n
  • 使用相同的(与 Java 11 \xe2\x98\x9d\xef\xb8\x8f)alg:

    \n
      int spaceSize = n - s.length();\n  int prefixSize = spaceSize / 2;\n  int suffixSize = (spaceSize + 1) / 2\n  return n > s.length()\n       ? space(prefixSize) + s + space(suffixSize)\n       : s;\n\n\nprivate String space(int spaceSize) {\n  return generate(() -> " ").limit(spaceSize).collect(joining());\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n


小智 6

将在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));
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

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