我想在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";
}
答案 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)
右对齐:
string.Format("{0," +((n*n).ToString().Length + 1).ToString() +"}", i * j)
答案 1 :(得分: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。这是(出于显而易见的原因)控制台,所以在我的小提琴中输入数字是固定的(它在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个短号码标签。但对于像你这样的小桌子来说这没问题。
您可以使用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();