- #1
SlurrerOfSpeech
- 141
- 11
I'm writing a class to format console output and the trickiest method in this class so far is the one for printing a table. I'm having it act like an HTML table in how text fits
It's almost correct except for the fence post
For example, when I test it with the string
here's what it ends up looking like:
Where's the flaw that is causing that? I'm trying to make this as compact, elegant, efficient and readable as possible, but it's proving difficult.
Code:
public static void PrintTable ( string[][] cells )
{
// Outputs content in cells matrix like
// =========================================
// cells[0][0] | cells[0][1]
// -----------------------------------------
// cells[1][0] | cells[1][1]
// -----------------------------------------
// cells[2][0] | cells[2][1]
// .
// .
// -----------------------------------------
// cells[n-1][0] | cells[n-1][1]
// ========================================
// Each cell must be able to hold at least 1 character inside
// 1 space of padding on the left and right
int linelen = OutputFormatter.OutputMaxLength; // copy of width (in characters) of lines being formatted
// Calculate widths of columns 1 and 2 (excluding the single space of padding on the
// left and right side of each):
int w1 = Math.Min(cells.Max(c => c[0].Length), linelen - 6);
int w2 = linelen - w1 - 5;
OutputFormatter.PrintChars('-'); // prints a line of equals signs for the top border of the table
// print out rows:
foreach ( string[] row in cells )
{
// Make the strings corresponding to the first and second column have equal
// length by adding whitespace to the end of the shorter one:
String padding = new String(' ', Math.Abs(row[0].Length - row[1].Length));
if ( row[0].Length > row[1].Length ) row[1] += padding;
else row[0] += padding;
// Print out content of row
int i = 0, j = 0, n = row[0].Length - Math.Max(w1,w2);
for ( ; i < n && j < n; i += w1, j += w2 )
{
Console.WriteLine(" {0} | {1} ",
row[0].Substring(i,w1),
row[1].Substring(j,w2));
}
Console.WriteLine(" {0} | {1} ",
row[0].Substring(i,row[0].Length - i),
row[1].Substring(j,row[1].Length - j)); OutputFormatter.PrintChars('-'); // prints a line of dashes to separate rows
}
}
Code:
Console.WriteLine(" {0} | {1} ",
row[0].Substring(i,row[0].Length - i),
row[1].Substring(j,row[1].Length - j));
For example, when I test it with the string
Code:
private static readonly string[][] _instructs = new string[][] {
new string[] {"CompareLastTwo","Shows difference between friends lists of last two Facebook data files in repository"},
new string[] {"AddFriendList <DataFolderPath>", "blah blah blah"}
};
here's what it ends up looking like:
Where's the flaw that is causing that? I'm trying to make this as compact, elegant, efficient and readable as possible, but it's proving difficult.