在控制台中打印对齐文本

时间:2014-12-11 09:23:04

标签: c# string console-application string.format

我想要的是在控制台的右侧打印合理的文本。完全像所有控制台帮助命令一样。

例如复制命令:通过键入copy /?,结果的一部分将是以下文本(由于Windows语言,此文本为德语):

Quelle        Bezeichnet die zu kopierende(n) Datei(en).
 /A           Weist auf eine ASCII-Textdatei hin.
 /B           Weist auf eine Binärdatei hin.
 /D           Zieldatei kann entschlüsselt erstellt werden.
 Ziel         Bezeichnet das Verzeichnis und/oder Dateinamen der neuen
              Datei(en).
 /V           Überprüft, ob die Dateien richtig geschrieben wurden.
 /N           Verwendet den Kurznamen (falls vorhanden), beim Kopieren
              einer Datei mit einem Nicht-8Punkt3-Namen.
 /Y           Unterdrückt die Bestätigungsaufforderung beim Überschreiben
              vorhandener Zieldateien.
 /-Y          Fordert beim Überschreiben vorhandener Zieldateien zum
              Bestätigen auf.

在这种情况下,"右栏中的每个文字"超出界限的将在列的开头继续,例如:Ziel

我尝试过以下操作,但没有任何结果返回所需的结果:

Console.WriteLine("{0,10}", "/s            The path from the source file (.ini file)");

Console.Write("{0,2}{1,20}", "/d", "The path where the destination file will be converted and copied (.xml file)");

Console.WriteLine("{0}\t\t{1}", "/s=d", "The path from the source file. The destination file will be automatically converted and copied in the same path with the source file.".PadLeft(100));

Console.WriteLine("{0,-10}{1,10}{2,-30}",
                    "/s            The path from the source file (.ini file)",
                    "/d            The path where the destination file will be converted and copied (.xml file)",
                    "/s=d          The path from the source file. The destination file will be automatically converted and copied in the same path with the source file.");

3 个答案:

答案 0 :(得分:0)

您可以在打印功能中使用\ t,这是一个TAB,可以在1到4个空格之间

Console.WriteLine("Quelle\t\tBezeignet....");
Console.WriteLine("/A\t\tWeist...");

生成您想要的输出。

我会另外回答:

使用此方法,您可以阻止在控制台上的任何位置打印:

    static int PrintBlock(int offset, int y, int maxLineLength, string text)
    { 
        //get the words
        var parts = text.Split(new char[] { ' ' });
        int i=0;
        var sb = new StringBuilder();
        for (; i < parts.Length; i++)
        {
            if (sb.Length + parts[i].Length < maxLineLength)
            {
                sb.Append(parts[i]);
                sb.Append(" ");
            }
            else
            {
                //this is a line
                Console.SetCursorPosition(offset, y);
                Console.Write(sb.ToString().Trim());
                sb.Clear();
                i--;
                y++;
            }
        }
        //print the last line
        Console.SetCursorPosition(offset, y);
        Console.Write(sb.ToString().Trim());
        y++;
        return y;
    }

你这样使用它:

var text = "This is a text that exceeds the width of the console and must be displayed in a block for displaying help to a user";
var newOffset = PrintBlock(10, 2, 20, text);

newOffset是开始下一行的y位置。

答案 1 :(得分:0)

最简单的方法是使用逐字字符串运算符@,如下所示:

            Console.WriteLine(
@"Quelle        Bezeichnet die zu kopierende(n) Datei(en).
 /A           Weist auf eine ASCII-Textdatei hin.
 /B           Weist auf eine Binärdatei hin.
 /D           Zieldatei kann entschlüsselt erstellt werden.
 Ziel         Bezeichnet das Verzeichnis und/oder Dateinamen der neuen
              Datei(en).
 /V           Überprüft, ob die Dateien richtig geschrieben wurden.
 /N           Verwendet den Kurznamen (falls vorhanden), beim Kopieren
              einer Datei mit einem Nicht-8Punkt3-Namen.
 /Y           Unterdrückt die Bestätigungsaufforderung beim Überschreiben
              vorhandener Zieldateien.
 /-Y          Fordert beim Überschreiben vorhandener Zieldateien zum
              Bestätigen auf."
              );

请注意,当您输入此内容时,不要像使用普通程序代码那样缩进字符串(否则用于缩进的空格实际上将构成字符串的一部分)。

或者,只需使用字符串连接:

Console.WriteLine
(
    "Quelle        Bezeichnet die zu kopierende(n) Datei(en).\n"+
    " /A           Weist auf eine ASCII-Textdatei hin.\n" +
    " /B           Weist auf eine Binärdatei hin.\n" +
    " /D           Zieldatei kann entschlüsselt erstellt werden.\n" +
    " Ziel         Bezeichnet das Verzeichnis und/oder Dateinamen der neuen\n" +
    "              Datei(en).\n" +
    " /V           Überprüft, ob die Dateien richtig geschrieben wurden.\n" +
    " /N           Verwendet den Kurznamen (falls vorhanden), beim Kopieren\n" +
    "              einer Datei mit einem Nicht-8Punkt3-Namen.\n" +
    " /Y           Unterdrückt die Bestätigungsaufforderung beim Überschreiben\n" +
    "              vorhandener Zieldateien.\n" +
    " /-Y          Fordert beim Überschreiben vorhandener Zieldateien zum\n" +
    "              Bestätigen auf."
);        

只需添加空格即可让它看起来像你想要的那样。如果字符串是常量,则不需要使用字符串格式说明符。

答案 2 :(得分:0)

好吧,作为“快速和脏”的写字符串留下缩进的方法,你可以做一些简单的计算,并写入控制你的字符串“逐个部分”。

示例代码:

private static void WriteLineIndented(string line, int leftMargin, int width)
{
    if (string.IsNullOrEmpty(line))
        return;

    for(int i = 0; i < leftMargin; i++)
        Console.Write(" ");

    if (line.Length <= width - leftMargin)
    {
        Console.WriteLine(line);
        return;
    }
    else
    {
        int position = Math.Min(width - leftMargin, line.Length - 1);

        while (position > 0 && line[position] != ' ')
            position--;

        Console.WriteLine(line.Substring(0, position));
        WriteLineIndented(line.Substring(position + 1, line.Length - position - 1), leftMargin, width);
    }
}

用法:

string s = "The path from the source file. The destination file will be automatically converted and copied in the same path with the source file.";
WriteLineIndented(s, 10, 80);

结果:

      The path from the source file. The destination file will be
      automatically converted and copied in the same path with the source
      file.

这种方法可以根据您的情况轻松修改 - 只需编写您需要的所有内容,而不仅仅是第一行中的空格。