Центрирование текста в консольном приложении C# работает только с некоторыми входными данными

у меня проблема с центрированием текста на C#.Консольное приложение NET4.

Это мой метод центрирования текста:

private static void centerText(String text)
{
    int winWidth = (Console.WindowWidth / 2);
    Console.WriteLine(String.Format("{0,"+winWidth+"}", text));
}

тем не менее, я просто получаю вывод, как он был бы выведен нормально. Если я использую эту строку:

Console.WriteLine(String.Format("{0,"+winWidth+"}", "text"));

" текст " центрируется так, как должен.

Я призываю centerText С помощью этих двух методов:

private static void drawStars()
{
    centerText("*********************************************");
}
private static void title(string location)
{
    drawStars();
    centerText("+++ Du er nu her: " + location + "! +++");
    drawStars();
}

3 ответов


попробуйте это вместо этого:

private static void centerText(String text)
{
    Console.Write(new string(' ', (Console.WindowWidth - text.Length) / 2));
    Console.WriteLine(text);
}

проблема с вашим исходным кодом, что ваш текст начинается в центре экрана. Вы хотите, чтобы центр текста был там.

вы собираетесь сделать немного больше работы, если вы хотите напечатать целые абзацы по центру, как это.


текст, переданный в может иметь пробелы, такие как \r\n, затем удалите это перед вызовом записи, такой как

string textClean = Regex.Replace(text, @"([\r\n])", string.Empty);

// Then center on text clean 

у меня есть собственный метод вызова заголовков консоли:

public static void Header(string title, string subtitle = "", ConsoleColor color = ConsoleColor.White)
{
    int windowWidth = 90 - 2;
    string titleContent = String.Format("║{0," + ((windowWidth / 2) + (title.Length / 2)) + "}{1," + (windowWidth - (windowWidth / 2) - (title.Length / 2) + 1) + "}", title, "║");
    string subtitleContent = String.Format("║{0," + ((windowWidth / 2) + (subtitle.Length / 2)) + "}{1," + (windowWidth - (windowWidth / 2) - (subtitle.Length / 2) + 1) + "}", subtitle, "║");

    Console.WriteLine("╔════════════════════════════════════════════════════════════════════════════════════════╗");
    Console.WriteLine(titleContent);
    if (!string.IsNullOrEmpty(subtitle))
    {
        Console.WriteLine(subtitleContent);
    }
    Console.WriteLine("╚════════════════════════════════════════════════════════════════════════════════════════╝");
}

тогда вы называете это так YourStaticClass.Header("Test", "Version 1.0");

это должно выглядеть так:

╔════════════════════════════════════════════════════════════════════════════════════════╗
║                                          Test                                          ║
║                                      Version 1.0                                       ║
╚════════════════════════════════════════════════════════════════════════════════════════╝

можно заменить на 90 на windowsWidth С Console.WindowWidth