2015-05-27 2 views
1

мне нужно взять строку ввода и разбить его на строки, выполнив следующие правила:Разбиваем строку в фиксированной длины строки текста с словом непосильным

  1. линии должно быть меньше или равно 80 символов.
  2. линии должны разделяться на пространство, а не сломать слова в два.

Я пробовал это три раза, но мой код просто ужасен.

foreach (ChoiceClass c in q.ChoiceTextArray) 
{ 
    int runningIndex = 0; 
    int m = Math.Max(c.Description.Length - 1, 80); 
    int numLines = (c.Description.Length/80) + 1; 

    while (numLines > 0) 
    { 
     int len = 80; 
     if (numLines == 1) 
     { 
      len = c.Description.Length - runningIndex; 
     } 

     string tmp = string.Empty; 
     if (numLines > 1) 
     { 
      tmp = c.Description.Substring(runningIndex, len); 
     } 
     else 
     { 
      if (runningIndex > c.Description.Length) 
      { 
       richTextBox2.Text += "\t" + tmp + eol; 
       runningIndex += tmp.Length + 1; 
       numLines--; 
      } 
      else 
      { 
       tmp = c.Description.Substring(runningIndex); 
       richTextBox2.Text += "\t" + tmp + eol; 
       runningIndex += tmp.Length + 1; 
       numLines--; 

      } 
     } 
    } 
} 
+1

«Мой код просто ужасный» не вопрос. Это работает? Хорошо. Вы хотите, чтобы он был короче или читабельнее? Попробуйте спросить об обзоре кода, но не перед тем, как прочитать их http://codereview.stackexchange.com/help/how-to-ask. – CodeCaster

+0

Спасибо за большое предложение. Я сделаю это с этого момента. -Su –

+0

Это поздний ответ! Счастлив, что был полезен два года назад. : P – CodeCaster

ответ

0

Не уверен, что если код гораздо лучше, чем у вас ... нет другого заявления

var text = 
      @"this a asdf asdf asdf asdf asdf wdbwbwrthwrthw rthwrth wth wrt h wrn wrnbfb wbwbwbb s jkvjv j j o o , , mfnfnsxuiua sdf asdfas dfasd f 
asdf asd fasdf asdf asdf asdf asd fasdf asd fasdf asdf asdf asdf asdf asdf asd fasdf as 
df asd fasdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf "; 

     var sb = new StringBuilder(); 
     var currentLine = String.Empty; 
     var split = text.Split(' '); 

     foreach (var s in split) 
     { 
      if (s.Length >= 80) 
      { 
       if (!String.IsNullOrEmpty(currentLine)) 
       { 
        sb.AppendLine(currentLine); 
        currentLine = ""; 
       } 

       sb.AppendLine(s); 
       continue; 
      } 

      if ((String.Format("{0} {1}", currentLine, s).Length > 80)) 
      { 
       sb.AppendLine(currentLine); 
       currentLine = ""; 
      } 

      currentLine += s + " "; 
     } 

     if (!String.IsNullOrEmpty(currentLine)) 
     { 
      sb.AppendLine(currentLine); 
     } 

     var final = sb.ToString(); 
+0

Это выглядит очень многообещающим. Я попробую это КАК МОЖНО СКОРЕЕ –

+0

Я попробовал, но выход помещает одно однобуквенное слово в строку. Это было близко! Я думаю, что ответ (1) Напишите метод, который принимает длину 80 символов в качестве ввода. (2) печатайте каждый символ по одному, пока не дойдете до конечного места, а затем остановите. (3) Использовать content.LastIndexOf (""); для получения последнего индекса конечного пространства. –

+0

Является ли одно двухбуквенное слово, потому что вы использовали строку, у которой осталось 2, когда вы разделите длину на 80? Когда я запускаю вашу строку 'somethingLongToPrint', вывод верен. С какой строкой вы протестировали? –

0

У меня есть рабочий пример сейчас!

private void button1_Click(object sender, EventArgs e) 
    { 
     string somethingLongToPrint = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 

     int i = 0; 
     string tmp = string.Empty; 
     string overrun = string.Empty; 
     int len = somethingLongToPrint.Length - 1; // 0-based counting 
     while(i < len) 
     { 
      if (overrun != string.Empty) 
      { 
       // to keep the length down to 80 and still account for overrun, i should subtract the length of overrun 
       // If the number of characters left in "somethingLongToPrint" is less than 80, then then 
       int numberOfCharactersRemaining = somethingLongToPrint.Length - i; 
       if (numberOfCharactersRemaining > 80) 
       { 
        tmp = overrun + somethingLongToPrint.Substring(i - overrun.Length, 80); 
       } 
       else 
       { 
        tmp = overrun + somethingLongToPrint.Substring(somethingLongToPrint.Length - numberOfCharactersRemaining); 
       } 
      } 
      else 
      { 
       tmp = somethingLongToPrint.Substring(i, ((80 - overrun.Length))); 
      } 
      overrun = print80CharacterLine(tmp); 
      i += 80; 
     } 

    } 

    // returns what was not printed 
    private string print80CharacterLine(string src) 
    { 
     string eol = "\r\n"; 

     string whatIsLeft = string.Empty; 

     int index = src.LastIndexOf(" "); 

     string calculatedString = src.Substring(0, index); 

     whatIsLeft = src.Substring((index+1)); 

     // print statement here 
     // do the e.Graphics.DrawString(lines[linesPrinted], someFont, brush, x, y); 
     textBox1.Text += calculatedString + eol; 

     return whatIsLeft; 


    } 
Смежные вопросы