Как я могу выровнять текст в столбцах с помощью Console.WriteLine?
У меня есть вид столбцов, но конец двух столбцов, похоже, не правильно выравнивается. Это код, который у меня есть на данный момент:
Console.WriteLine("Customer name "
+ "sales "
+ "fee to be paid "
+ "70% value "
+ "30% value");
for (int DisplayPos = 0; DisplayPos < LineNum; DisplayPos = DisplayPos + 1)
{
seventy_percent_value = ((fee_payable[DisplayPos] / 10.0) * 7);
thirty_percent_value = ((fee_payable[DisplayPos] / 10.0) * 3);
Console.WriteLine(customer[DisplayPos] + " "
+ sales_figures[DisplayPos] + " "
+ fee_payable[DisplayPos] + " "
+ seventy_percent_value + " "
+ thirty_percent_value);
}
Я новичок-программист, поэтому я не понимаю всех советов, но если у вас есть какие-либо советы, мы будем очень благодарны!
Ответы
Ответ 1
Вместо того, чтобы вручную выровнять текст в столбцы с произвольными строками пробелов, вы должны вставлять фактические вкладки (escape-последовательность \t
) в каждую строку вывода:
Console.WriteLine("Customer name" + "\t"
+ "sales" + "\t"
+ "fee to be paid" + "\t"
+ "70% value" + "\t"
+ "30% value");
for (int DisplayPos = 0; DisplayPos < LineNum; DisplayPos++)
{
seventy_percent_value = ((fee_payable[DisplayPos] / 10.0) * 7);
thirty_percent_value = ((fee_payable[DisplayPos] / 10.0) * 3);
Console.WriteLine(customer[DisplayPos] + "\t"
+ sales_figures[DisplayPos] + "\t"
+ fee_payable + "\t\t"
+ seventy_percent_value + "\t\t"
+ thirty_percent_value);
}
Ответ 2
Попробуйте это
Console.WriteLine("{0,10}{1,10}{2,10}{3,10}{4,10}",
customer[DisplayPos],
sales_figures[DisplayPos],
fee_payable[DisplayPos],
seventy_percent_value,
thirty_percent_value);
где первое число внутри фигурных скобок является индексом, а второе - выравниванием. Знак второго номера указывает, должна ли строка быть выровнена влево или вправо. Используйте отрицательные числа для выравнивания слева.
Или посмотрите
http://msdn.microsoft.com/en-us/library/aa331875(v=vs.71).aspx
Ответ 3
Просто добавьте к ответу roya. В С# 6.0 теперь вы можете использовать интерполяцию строк:
Console.WriteLine($"{customer[DisplayPos],10}" +
$"{salesFigures[DisplayPos],10}" +
$"{feePayable[DisplayPos],10}" +
$"{seventyPercentValue,10}" +
$"{thirtyPercentValue,10}");
На самом деле это может быть одна строка без лишних долларов, я просто думаю, что это немного легче читать так.
И вы также можете использовать статический импорт на System.Console, позволяющий сделать это:
using static System.Console;
WriteLine(/* write stuff */);
Ответ 4
Я знаю, очень старая нить, но предлагаемое решение не было полностью автоматическим, когда есть более длинные строки.
Поэтому я создал небольшой вспомогательный метод, который делает его полностью автоматическим. Просто перейдите в список строкового массива, где каждый массив представляет строку и каждый элемент в массиве, а также элемент строки.
Метод можно использовать следующим образом:
var lines = new List<string[]>();
lines.Add(new[] { "What", "Before", "After"});
lines.Add(new[] { "Name:", name1, name2});
lines.Add(new[] { "City:", city1, city2});
lines.Add(new[] { "Zip:", zip1, zip2});
lines.Add(new[] { "Street:", street1, street2});
var output = ConsoleUtility.PadElementsInLines(lines, 3);
Вспомогательный метод выглядит следующим образом:
public static class ConsoleUtility
{
/// <summary>
/// Converts a List of string arrays to a string where each element in each line is correctly padded.
/// Make sure that each array contains the same amount of elements!
/// - Example without:
/// Title Name Street
/// Mr. Roman Sesamstreet
/// Mrs. Claudia Abbey Road
/// - Example with:
/// Title Name Street
/// Mr. Roman Sesamstreet
/// Mrs. Claudia Abbey Road
/// <param name="lines">List lines, where each line is an array of elements for that line.</param>
/// <param name="padding">Additional padding between each element (default = 1)</param>
/// </summary>
public static string PadElementsInLines(List<string[]> lines, int padding = 1)
{
// Calculate maximum numbers for each element accross all lines
var numElements = lines[0].Length;
var maxValues = new int[numElements];
for (int i = 0; i < numElements; i++)
{
maxValues[i] = lines.Max(x => x[i].Length) + padding;
}
var sb = new StringBuilder();
// Build the output
bool isFirst = true;
foreach (var line in lines)
{
if (!isFirst)
{
sb.AppendLine();
}
isFirst = false;
for (int i = 0; i < line.Length; i++)
{
var value = line[i];
// Append the value with padding of the maximum length of any value for this element
sb.Append(value.PadRight(maxValues[i]));
}
}
return sb.ToString();
}
}
Надеюсь, это поможет кому-то. Источник из сообщения в моем блоге: http://dev.flauschig.ch/wordpress/?p=387
Ответ 5
Вы можете использовать вкладки вместо пробелов между столбцами и/или устанавливать максимальный размер для столбца в строках формата...