2016-02-28 88 views
4

我想在C#中打印乘法表,但它沒有對齊! 當我們在文本框中鍵入數字「n」意味着:n * n表。 我能做什麼?在RichTextBox中對齊數字

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

+0

嘗試使用tab而不是空格。 'richTextBox1.Text + = Convert.ToString(i * j)+「\ t」;' – cylon

+0

將RichTextBox的字體設置爲'Courier New',然後通過填充乘法結果將文本添加到'RichTextBox'中: this.richTextBox1.AppendText(string.Format(「{0,3}」,i * j)); –

回答

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

如果你想使用空間對齊,你需要使用等寬字體(如快遞,或索拉),否則,你可以使用標籤:號碼也不會一致,雖然這種方式,並且由於例程中的數字可能會變得相當大,所以最終可能會導致您的數字超出製表符分隔範圍,並且如果發生這種情況,將會在對齊方式中產生不一致。

作爲一般規則,如果要對齊任何類型的文本框,請使用等寬字體。

可以用空格填充,例如,使用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就可以減少30mb的內存消耗(僅爲幾個kb)。

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