对齐RichTextBox中的数字

时间:2016-02-28 18:04:27

标签: c# .net winforms richtextbox

我想在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

3 个答案:

答案 0 :(得分: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 :(得分:1)

如果你想使用空格对齐,你需要使用等宽字体(比如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。这是(出于显而易见的原因)控制台,所以在我的小提琴中输入数字是固定的(它在myNumber中)并且输出只是一个字符串(而不是richTextBox1.Text ),但它应该显示它是如何工作的。

虽然我做了一些更改(我只转换输入数字一次,然后使用Environment.NewLine代替\n),但这远非最佳,但是,您应该构建字符串(使用StringBuilder)并立即分配,而不是添加到Text属性。我使用这种方法制作了fiddle,并且只使用StringBuilder,内存消耗减少了30多亿(仅为少数kb)。

答案 2 :(得分: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();