如何将打印语句文本居中?

时间:2013-05-18 22:12:19

标签: java

所以我正在研究我的java项目,在程序的一部分我正在打印文本 文本显示在左侧 但是我希望它显示在中间 我完成了多少次? 这是一个新手问题吗?

示例:

public static void main(String[] args)
{
System.out.println("Hello");
}

7 个答案:

答案 0 :(得分:8)

非常快速回答

您可以使用JavaCurses库在控制台上执行有趣的操作。请阅读下面的内容。

在你做之前,让我们在某些情况下回答你的整个问题

这是一个新手问题:)但这是一个有效的问题。所以给你一些提示:

第一个问题是,终端有多宽? (以字符数计算)旧终端的固定尺寸为80个字符和25行;

因此,作为第一步,假设它是80个字符宽。

如何将字符串置于80字符宽的终端屏幕上?

你需要担心弦的长度吗?你如何水平定位?你添加空格吗?你能想出一个格式字符串吗?

一旦你编写了一个程序,你可以给它任何字符串,这些字符串将在这些假设上正确显示(该终端是80个字符宽),你现在可以开始担心如果你连接到一个终端,会发生什么多于或少于80个字符?或者您是否连接到终端。例如,如果你不是,那么“美化”你的代码是否有意义?可能不是。

所以问题是如何获得所有这些信息?

您要求的是能够将控制台视为具有基于字符的控制功能的智能电传打字机(tty)终端。旧式电传终端可以做很多有趣的事情。

一些历史

电传打字机终端是一件很复杂的事情,而且有很多终端制造商(IBM,DEC等)的遗产......这些电传打字机终端的开发是为了解决许多问题,例如能够远程显示内容大型机和小型机。

有许多终端标准vt100,vt200,vt220,ansi,它们来自终端开发历史中的各个点以及沿途的数百个专有标准。

这些终端可以定位光标和窗口和颜色,突出显示文本,下划线等但不是每个人都可以做任何事情。然而,这是使用“控制”字符完成的。 ctrl-l是ansi和vt终端上的清晰屏幕,但它可能是其他内容的页面提要。

如果您编写了一个特定于某个程序的程序,那么其他地方就没有任何意义。因此,制作这么简单的必要性导致开发了一些隐藏掉这些丑陋的抽象库。

第一个称为termcap(终端能力)库,大约1978年,它提供了一种处理UNIX系统终端的通用方法。它可以告诉正在运行的程序终端的可用功能(例如更改文本颜色的能力)或将光标定位在某个位置,或清除自身等等,然后程序会相应地修改其行为。

第二个库名为curses,大约在1985年(??)它是作为BSD系统的一部分开发的,用于编写游戏......这个库最流行的版本之一是GNU curses库(以前被称为ncurses)。

在VMS上我相信该库名为SMG $(屏幕管理库)。

On with the answer

如何,所以你可以在java中使用这些库中的一个来确定你是否正在使用正确的终端。源forge上有一个名为JavaCurses的库,它为java程序提供了这种功能。这将是学习如何在您的课程中使用新图书馆的练习,应该是令人兴奋的。

JavaCurses在Unix和Windows环境中提供终端编程功能。这将是一个有趣的练习,你可以看看你是否可以用它来玩。

高级练习

另一个练习是使用相同的库来查看是否可以创建一个在终端上很好地显示的程序,并且还可以写出没有终端代码的文本文件;

如果您有任何问题,请发布,我会随时为您提供帮助。

答案 1 :(得分:2)

如果你有一个明确的行长,apache commons StringUtils.center将很容易完成这项工作。但是,您必须添加该库。 javadoc

答案 2 :(得分:1)

您可以执行以下操作:

public static void main(String[] args) {
    String h = "Hello";

    System.out.println(String.format("%-20s", h));
}

此方法输出给定数量的空格的字符串偏移量。在这种情况下,Hello前面有20个空格。空格位于Hello之前,因为%s之间的整数为负数,否则空格将为尾随。

只要弄清%s之间的整数,直到得到所需的结果。

答案 3 :(得分:1)

控制台的Java打印语句无法居中,因为行没有最大宽度。

如果您的控制台仅限于80个字符,您可以编写一个特殊的记录器来填充带有空格的字符串。

如果您的字符串大于80个字符,那么您必须剪切字符串并在下一行打印剩余字符串。此外,如果其他人使用你的应用程序与宽度不同(特别是更小)的控制台,如果看起来很奇怪。

所以基本上,不,没有简单的方法来集中输出...

答案 4 :(得分:1)

如果您知道尺寸并且不想使用外部库,则可以执行以下操作:

static void printer(String str, int size) {
    int left = (size - str.length()) / 2;
    int right = size - left - str.length();
    String repeatedChar = "-";
    StringBuffer buff = new StringBuffer();
    for (int i = 0; i < left; i++) {
        buff.append(repeatedChar);
    }
    buff.append(str);
    for (int i = 0; i < right; i++) {
        buff.append(repeatedChar);
    }
    // to see the end (and debug) if using spaces as repeatedChar
    //buff.append("$");  
    System.out.println(buff.toString());
}

// testing:

printer("string", 30);

// output:
// ------------string------------

如果您使用size变量的奇数号码来调用它,则右侧会有一个-。您可以将repeatedChar更改为空格。

修改

如果您只想打印一个char而且您知道尺寸,则可以使用默认的System.out.printf执行此操作:

int size = 10;
int left = size/2;
int right = size - left;
String format = "%" + left + "c%-" + right + "c";
// would produce: "%5c%-5c"
System.out.printf(format,' ', '#');
// output: "     #    " (without the quotes)

%-5c#字符与分配给它的5个空格的左侧对齐

答案 5 :(得分:0)

你做不到。您正在写入没有宽度的控制台,因此中心未定义。

答案 6 :(得分:0)

许多编程问题,请不要重新发明轮子!

Apache有一个不错的库:“ org.apache.commons”,它带有StringUtils类:

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

pad方法是您想要的:

int w = 20;

System.out.println(StringUtils.rightPad("+", w - 1, "-") + "+");
System.out.println(StringUtils.center(StringUtils.center("output", w - 2), w, "|"));
System.out.println(StringUtils.rightPad("+", w - 1, "-") + "+");

会给您:

+----------------------+
|        output        |
+----------------------+