Reputation: 53
I'm trying to format some output to the console but having some problems with a solution. I'm doing it in C# but everything time I call Console.Write it prints the the entire thing to the very end of the console then starts a new line. So what I want to do is adjust it to four columns and then start a newLine there.
Here's the correct way the output should look like in the console:
Sam John Bob Adam
Kelly Nolan Carl Tim
Tom David
Here's whats mine turns out to look like but its the wrong way:
Sam John Bob Adam Kelly Nolan Carl Tim
Tom David
If you have any ideas please provide them
Upvotes: 2
Views: 4658
Reputation: 5815
if i understood your question .I have used below technique for printing out a table in Txt (log file) in console.
The trick is to use the String.format
// Example from - http://msdn.microsoft.com/en-us/library/system.string.format.aspx
using System;
public class Example
{
public static void Main()
{
// Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
Tuple<string, DateTime, int, DateTime, int>[] cities =
{ Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277,
new DateTime(1950, 1, 1), 1970358),
Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995,
new DateTime(1950, 1, 1), 7891957),
Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808,
new DateTime(1950, 1, 1), 3620962),
Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452,
new DateTime(1950, 1, 1), 1849568) };
// Display header
string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
"City", "Year", "Population", "Change (%)");
Console.WriteLine(header);
string output;
foreach (var city in cities) {
output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
(city.Item5 - city.Item3)/ (double)city.Item3);
Console.WriteLine(output);
}
}
}
// The example displays the following output:
// City Year Population Year Population Change (%)
//
// Los Angeles 1940 1,504,277 1950 1,970,358 31.0 %
// New York 1940 7,454,995 1950 7,891,957 5.9 %
// Chicago 1940 3,396,808 1950 3,620,962 6.6 %
// Detroit 1940 1,623,452 1950 1,849,568 13.9 %
Upvotes: 3
Reputation: 65079
I would write something that managed the padding and layout.. perhaps something like this?
class ConsoleColumnFormatter {
private int _columnWidth = 20;
private int _numColumns = 4;
private int _currentColumn = 0;
public ConsoleColumnFormatter(int numColumns, int columnWidth) {
_numColumns = numColumns;
_columnWidth = columnWidth;
}
public void Write(string str) {
Console.Write(str.PadRight(_columnWidth - str.Length, ' '));
_currentColumn++;
checkForNewLine();
}
private void checkForNewLine() {
if (_currentColumn >= _numColumns) {
Console.Write("\n");
_currentColumn = 0;
}
}
}
This:
ConsoleColumnFormatter formatter = new ConsoleColumnFormatter(4, 20);
for (int i = 1; i <= 10; i++)
formatter.Write("Column " + i.ToString());
..produces, this:
Column 1 Column 2 Column 3 Column 4
Column 5 Column 6 Column 7 Column 8
Column 9 Column 10
Upvotes: 3
Reputation: 547
This is how you should write it:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<string> names = new List<string>() {"Sam","John","Bob","Adam","Kelly","Nolan","Carl","Tim","Tom","David"};
for (int i = 0; i < names.Count; i++)
{
if (i % 4 == 0 && i > 0)
Console.WriteLine();
Console.Write(names[i] + "\t");
}
Console.ReadLine();
}
}
}
The output would be the same as you wish
Upvotes: 1
Reputation: 615
You can also utilize StringBuilder's AppendLine or Environment.NewLine - for formatting the rows string before outputting to the Console.
Upvotes: 0
Reputation: 9214
To start a new line:
Console.WriteLine();
For example:
var names = str.Split();
for (int i = 0; i < names.Length; i++)
{
Console.Write(names[i] + '\t');
if ((i + 1) % 4 == 0)
Console.WriteLine();
}
Upvotes: 0