在RichTextBox中对齐数字

4

我想在C#中打印一个乘法表,但它没有对齐!当我们在文本框中输入一个数字“n”时,意味着:n * n 表格。我该怎么办?

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


尝试使用制表符代替空格。 richTextBox1.Text += Convert.ToString(i * j) + "\t"; - cylon
RichTextBox 的字体设置为 Courier New,然后通过填充乘法结果的方式将文本添加到 RichTextBox 中:this.richTextBox1.AppendText(string.Format("{0,3}", i * j)); - Reza Aghaei
3个回答

7
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
如果您想使用空格对齐,需要使用等宽字体(如Courier或Consolas),否则可以使用制表符:这种方式不会对数字进行对齐,由于您的程序中的数字可能会变得非常大,因此如果数字占据了超过制表符间隔的空间,则对齐将出现不一致性。
通常情况下,如果您想对齐任何类型的文本框,请选择等宽字体。
您可以使用空格填充,例如使用String.PadLeft或String.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。由于显而易见的原因,它是针对控制台的,因此在我的fiddle中,输入数字是固定的(在myNumber中),输出只是一个字符串(而不是richTextBox1.Text),但它应该展示了它的工作原理。
虽然我已经做了一些改变(我只转换一次输入数字,并使用Environment.NewLine代替\n),但这远非最佳方案,你应该构建字符串(使用StringBuilder)并一次性赋值,而不是添加到Text属性中。我用这种方法制作了一个fiddle,内存消耗减少了30多mb(仅为几kb),只需使用StringBuilder即可。

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";
}

但是重要的是,选项卡需要有固定的宽度。如果您的数字太长,您需要使用两个选项卡来显示短数字。但对于像您这样的小表格,这不是问题。

Screenshot with standard tab size

你可以使用 SelectionTabs 属性来改变选项卡的位置:
this.richTextBox1.SelectionTabs = new[] { 20, 40, 60, 80 };

Screenshot with customized tab size

顺便提一下,你应该使用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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接