在 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.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,仅通过使用 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();
我想在 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.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,仅通过使用 StringBuilder
.
设置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();