2016-02-28 162 views
4

我想在C#中打印乘法表,但它没有对齐! 当我们在文本框中键入数字“n”意味着:n * n表。 我能做什么?在RichTextBox中对齐数字

for (int i = 1; i <= Convert.ToInt32(textBox1.Text); i++) 
{ 
    for (int j = 1; j <= Convert.ToInt32(textBox1.Text); j++) 
    { 
     richTextBox1.Text += Convert.ToString(i * j) + " "; 
    } 
    richTextBox1.Text += "\n"; 
} 

enter image description here

+0

尝试使用tab而不是空格。 'richTextBox1.Text + = Convert.ToString(i * j)+“\ t”;' – cylon

+0

将RichTextBox的字体设置为'Courier New',然后通过填充乘法结果将文本添加到'RichTextBox'中: this.richTextBox1.AppendText(string.Format(“{0,3}”,i * j)); –

回答

6

RichTextBox的字体设置为等宽字体Courier New,然后使用String.Format将文本添加到RichTextBox并设置乘法结果的对齐方式。使用正数右对齐,并使用一个负数左对齐:

var n = 5; 
for (int i = 1; i <= n; i++) 
{ 
    for (int j = 1; j <= n; j++) 
    { 
     this.richTextBox1.AppendText(string.Format("{0,3}", i * j)); 
    } 
    this.richTextBox1.AppendText(Environment.NewLine); 
} 

而是格式的基于字符的最大长度的结果通过{0,3}您可以使用下面的代码格式是一些属于n*n

左对齐:

string.Format("{0,-" +((n*n).ToString().Length + 1).ToString() +"}", i * j) 

enter image description here

右对齐:

string.Format("{0," +((n*n).ToString().Length + 1).ToString() +"}", i * j) 

enter image description here

1

如果你想使用空间对齐,你需要使用等宽字体(如快递,或索拉),否则,你可以使用标签:号码也不会一致,虽然这种方式,并且由于例程中的数字可能会变得相当大,所以最终可能会导致您的数字超出制表符分隔范围,并且如果发生这种情况,将会在对齐方式中产生不一致。

作为一般规则,如果要对齐任何类型的文本框,请使用等宽字体。

可以用空格填充,例如,使用String.PadLeftString.PadRight

这将是一样简单改变:

richTextBox1.Text += Convert.ToString(i * j) + " "; 

随着

richTextBox1.Text += Convert.ToString(i * j).PadLeft(5); 

然而这将假设所有数字在宽度最大5个字符。

为了您的日常精确,你可以尽管计算的最大宽度,所以你最终的东西,如:

// convert your input only once 
int myNumber = Convert.ToInt32(textBox1.Text); 
// pad with the maximum possible length, plus one space 
int padAmount = (myNumber * myNumber).ToString().Length + 1; 
for (int i = 1; i <= myNumber; i++) 
{ 
    for (int j = 1; j <= myNumber; j++) 
    { 
    // pad your input by the amount of spaces needed to fit all possible numbers 
    richTextBox1.Text += (i*j).ToString().PadLeft(padAmount); 
    } 
} 
// use Environment.NewLine instead of `\n` 
richTextBox1.Text += Environment.NewLine; 

这里有一个fiddle。这是(为显而易见的原因)控制台,所以在我的小提琴输入号码是固定的(它在myNumber)和输出只是一个字符串(而不是richTextBox1.Text),但它应该显示它如何工作。

虽然我做了一些改变(我只转换输入的号码一次,并使用Environment.NewLine代替\n),这是很不理想,虽然,你应该建立你的字符串(使用StringBuilder),并在其分配一次,而不是添加到Text属性。我已经用这种方法制作了fiddle,并且仅通过使用StringBuilder就可以减少30mb的内存消耗(仅为几个kb)。

1

我认为最好的办法是使用一个标签,而不是一个特殊的字体和填充用空格。

对于选项卡,您必须在每个数字后添加"\t""\t"将被评估为选项卡-字符。

for (int i = 1; i <= Convert.ToInt32(textBox1.Text); i++) 
{ 
    for (int j = 1; j <= Convert.ToInt32(textBox1.Text); j++) 
    { 
     richTextBox1.Text += Convert.ToString(i * j) + "\t "; //here at the end 
    } 
    richTextBox1.Text += "\n"; 
} 

但重要的是,选项卡具有固定的宽度。如果你的号码太长,你需要2个短号码标签。但对于像你这样的小桌子来说,这不成问题。

Screenshot with standard tab size

您可以更改标签的位置与SelectionTabs属性:

this.richTextBox1.SelectionTabs = new[] { 20, 40, 60, 80 }; 

Screenshot with customized tab size

BTW,你应该使用StringBuilder多个字符串部分串接一个。从textBox1中只分析一次而不是在每次迭代过程中解析数字会更有效。

var sb = new StringBuilder(); //In namespace System.Text 
var x = Convert.ToInt32(textBox1.Text); //parse only once 
for (int i = 1; i <= x; i++) 
{ 
    for (int j = 1; j <= x; j++) 
    { 
     sb.Append(Convert.ToString(i * j)); 
     sb.Append("\t "); 
    } 
    sb.Append("\n"); 
} 
richTextBox1.Text += sb.ToString();