在 RichTextBox 中对齐数字

Align numbers in RichTextBox

我想在 C# 中打印乘法 table,但它没有对齐! 当我们在文本框中键入数字 "n" 时,表示:n*n table。 我能做什么?

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

如果你想使用空格对齐,你需要使用等宽字体(如 Courier 或 Consolas),否则你可以使用制表符:数字不会以这种方式对齐,因为数字在你的例程中可能会变得相当大,最终您的数字可能会占用比制表符分隔更多的空间,如果发生这种情况,对齐方式会不一致。

一般来说,如果您想对齐任何类型的文本框,请使用等宽字体。

您可以使用空格填充,例如 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。它(出于明显的原因)用于控制台,所以在我的 fiddle 中输入数字是固定的(在 myNumber 中)并且输出只是一个字符串(而不是 richTextBox1.Text),但是它应该展示它是如何工作的。

虽然我做了一些更改(我只转换输入数字一次,并使用 Environment.NewLine 而不是 \n),但这远非最佳,你应该构建你的字符串(使用 StringBuilder)并立即分配,而不是添加到 Text 属性。我用这种方法做了一个 fiddle,仅通过使用 StringBuilder.

,内存消耗就减少了 30 多 mb(只有几 kb)

设置RichTextBox to the monospaced font Courier New, then add the text to RichTextBox using String.Format的字体和乘法结果的对齐方式。使用正数右对齐,使用负数左对齐:

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)

右对齐:

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

我认为最好的解决方案是使用制表符而不是特殊字体并用空格填充。

对于制表符,您必须在每个数字后添加一个 "\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 个标签来放置短号码。但是像你这样的小桌子没问题。

您可以使用 SelectionTabs 属性:

更改选项卡的位置
this.richTextBox1.SelectionTabs = new[] { 20, 40, 60, 80 };

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();