C# Column formatting

后端 未结 5 1773
失恋的感觉
失恋的感觉 2021-01-07 09:27

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 ent

相关标签:
5条回答
  • 2021-01-07 09:35

    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 %
    
    0 讨论(0)
  • 2021-01-07 09:39

    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
    
    0 讨论(0)
  • 2021-01-07 09:44

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

    0 讨论(0)
  • 2021-01-07 09:48

    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

    0 讨论(0)
  • 2021-01-07 09:53

    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();
    }
    
    0 讨论(0)
提交回复
热议问题