Austin Smith
Austin Smith

Reputation: 53

C# Column formatting

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

Answers (5)

aked
aked

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

Simon Whitehead
Simon Whitehead

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

farzin parsa
farzin parsa

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

enter image description here

Upvotes: 1

kat
kat

Reputation: 615

You can also utilize StringBuilder's AppendLine or Environment.NewLine - for formatting the rows string before outputting to the Console.

Upvotes: 0

tukaef
tukaef

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

Related Questions