【问题标题】:How to center a print statement text?如何使打印语句文本居中?
【发布时间】:2013-05-18 22:12:19
【问题描述】:

所以我正在处理我的 java 项目,并且在程序的一部分中我正在打印文本 文本显示在左侧 但是我希望它显示在中间 我有多少人做到了这一点? 这是一个新手问题吗?

例子:

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

【问题讨论】:

  • 为什么不将 graphics.drawString("Hello",x,y) 居中?您需要小程序才能拥有好用且简单的东西。
  • 简短的回答是:你不能。你不知道“中间”是什么——你打印的是标准输出。
  • 这个question 可能对你有一些有用的信息。
  • 你能澄清一下“中心”是什么吗?您在哪里查看程序的输出?可以假设输出总是被限制为 80 个字符吗?还是长度可变?
  • 我打印这个语句的地方是一个叫dr.java的jde

标签: java


【解决方案1】:

非常快速的回答

您可以使用 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$(屏幕管理库)。

回答问题

无论如何,您可以在 java 中使用这些库之一来确定您是否在正确的终端上工作。 source forge 上有一个名为JavaCurses 的库,它为java 程序提供了这种能力。这将是一个学习如何在您的程序中使用新库的练习,应该会令人兴奋。

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

进阶练习

另一个练习是使用同一个库,看看您是否可以创建一个在终端上显示良好的程序,并且还可以在没有终端代码的情况下写入文本文件;

如果您有任何问题,请留言,我会在您进行过程中提供帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 他将如何确定该方法所需的长度?
    【解决方案3】:

    到控制台的 Java 打印语句不能居中,因为没有最大行宽。

    如果您的控制台限制为例如 80 个字符,您可以编写一个特殊的记录器,用空格填充字符串。

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

    所以基本上,不,没有简单的方法可以使输出居中...

    【讨论】:

      【解决方案4】:

      你可以这样做:

      public static void main(String[] args) {
          String h = "Hello";
      
          System.out.println(String.format("%-20s", h));
      }
      

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

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

      【讨论】:

      • “%-20s”到底是做什么的?
      • %s 告诉 String 的 format 方法,有一个 String 变量位于 %s 所在的位置。 % 和 s 之间的 -20 告诉 String 的格式方法 String 应该偏移的空格数,负值向左偏移空格,正值向右偏移空格。
      • 它确实有效,但这不能动态化,对吧?
      • @ShreshthKharbanda 如果您要输出到的 IDE 或终端/命令提示符有一个可访问的变量(即环境变量)来保存输出控制台的列数,则它可以变成动态的。
      【解决方案5】:

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

      【讨论】:

      • 您可以有一个公式来添加前后多少个空格。你需要一个单独的方法才能清楚。
      • 这并不完全正确。如果您知道控制台宽度,或者将其限制为某个值,您可以轻松地将其居中。
      • @slhck - 除了不能保证即使 控制台。标准输出只是...标准输出
      • 好吧,与其将新手与重定向 stdio 和 stderr 以及各种其他部分混淆,不如将其视为一个完整的初学者并帮助他们解决问题。实际上可以确定控制台是否连接到支持终端仿真的 tty,因此您可以这样做。
      • 重点是,这个答案是正确的。当您谈论stdout 时,以编程方式无法确定“中间”。我很确定 OP 可以打印一些空格来将文本向右移动。
      【解决方案6】:

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

      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 个空格的左侧对齐

      【讨论】:

        【解决方案7】:

        由于编程问题很多,不要重新发明轮子!

        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        |
        +----------------------+
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-04
          • 2020-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多