2012-05-10 28 views
8

Tôi cần viết các đoạn văn bản khác nhau trong một khu vực nhất định. Ví dụ, tôi đã rút ra một hộp điều khiển trông giống như thế này:Quấn văn bản vào dòng kế tiếp khi nó vượt quá độ dài nhất định?

/----------------------\ 
|      | 
|      | 
|      | 
|      | 
\----------------------/ 

Làm thế nào tôi có thể viết văn bản bên trong nó, nhưng quấn nó vào dòng tiếp theo nếu nó trở nên quá dài?

+3

Những gì bạn đã thử? có chuyện gì? –

+0

Tôi lấy nó bạn không muốn chia nhỏ các từ? –

+0

@ L.B Tôi đã thử đọc độ dài của chuỗi và chia nhỏ nó nếu nó vượt quá chiều rộng của hộp, nhưng điều đó sẽ yêu cầu tôi chia nhỏ các từ. Và nó dường như không hoạt động tốt. –

Trả lời

10

Chia nhỏ trên không gian cuối cùng trước độ dài hàng của bạn?

int myLimit = 10; 
string sentence = "this is a long sentence that needs splitting to fit"; 
string[] words = sentence.Split(new char[] { ' ' }); 
IList<string> sentenceParts = new List<string>(); 
sentenceParts.Add(string.Empty); 

int partCounter = 0; 

foreach (string word in words) 
{ 
    if ((sentenceParts[partCounter] + word).Length > myLimit) 
    { 
     partCounter++; 
     sentenceParts.Add(string.Empty); 
    } 

    sentenceParts[partCounter] += word + " "; 
} 

foreach (string x in sentenceParts) 
    Console.WriteLine(x); 

CẬP NHẬT (giải pháp trên bị mất từ ​​cuối cùng trong một số trường hợp):

int myLimit = 10; 
string sentence = "this is a long sentence that needs splitting to fit"; 
string[] words = sentence.Split(' '); 

StringBuilder newSentence = new StringBuilder(); 


string line = ""; 
foreach (string word in words) 
{ 
    if ((line + word).Length > myLimit) 
    { 
     newSentence.AppendLine(line); 
     line = ""; 
    } 

    line += string.Format("{0} ", word); 
} 

if (line.Length > 0) 
    newSentence.AppendLine(line); 

Console.WriteLine(newSentence.ToString()); 
+0

Điều đó có khả năng tách các từ trong một nửa, mà tôi không muốn. –

+0

Một số ví dụ tuyệt vời [ở đây] (http://stackoverflow.com/questions/4398270/how-to-split-string-preserving-whole-words) –

+1

Không nên chia nhỏ các từ bằng một nửa vì nó chỉ thêm các từ đầy đủ cho đến khi đã đạt đến giới hạn độ dài. Tuy nhiên, sẽ tốt hơn nếu sử dụng đối tượng 'StringBuilder' để xây dựng dòng cuối cùng và sử dụng phương thức' String.Format' như sau: 'String.Format (" {0} ", word);'. Sử dụng điều tra viên cho danh sách thay vì nhận các phần tử theo chỉ mục cũng sẽ tốt đẹp :). Những nâng cấp có thể làm cho mã hiệu quả hơn, tuy nhiên, nó sẽ hoạt động như nó là tốt. –

2

tôi sửa đổi phiên bản của Jim H như vậy mà nó hỗ trợ một số trường hợp đặc biệt. Ví dụ: trường hợp câu không chứa bất kỳ ký tự trắng nào; Tôi cũng lưu ý rằng có một vấn đề khi một dòng có một không gian ở vị trí cuối cùng; sau đó không gian được thêm vào cuối và bạn kết thúc với một nhân vật quá nhiều.

Đây là phiên bản của tôi chỉ trong trường hợp ai đó đang quan tâm:

public static List<string> WordWrap(string input, int maxCharacters) 
{ 
    List<string> lines = new List<string>(); 

    if (!input.Contains(" ")) 
    { 
     int start = 0; 
     while (start < input.Length) 
     { 
      lines.Add(input.Substring(start, Math.Min(maxCharacters, input.Length - start))); 
      start += maxCharacters; 
     } 
    } 
    else 
    { 
     string[] words = input.Split(' '); 

     string line = ""; 
     foreach (string word in words) 
     { 
      if ((line + word).Length > maxCharacters) 
      { 
       lines.Add(line.Trim()); 
       line = ""; 
      } 

      line += string.Format("{0} ", word); 
     } 

     if (line.Length > 0) 
     { 
      lines.Add(line.Trim()); 
     } 
    } 

    return lines; 
} 
2

tôi sửa đổi phiên bản Manfred của. Nếu bạn đặt một chuỗi với ký tự '\ n' trong nó, nó sẽ bao bọc văn bản lạ bởi vì nó sẽ đếm nó như một ký tự khác. Với sự thay đổi nhỏ này tất cả sẽ diễn ra suôn sẻ.

public static List<string> WordWrap(string input, int maxCharacters) 
    { 
     List<string> lines = new List<string>(); 

     if (!input.Contains(" ") && !input.Contains("\n")) 
     { 
      int start = 0; 
      while (start < input.Length) 
      { 
       lines.Add(input.Substring(start, Math.Min(maxCharacters, input.Length - start))); 
       start += maxCharacters; 
      } 
     } 
     else 
     { 
      string[] paragraphs = input.Split('\n'); 

      foreach (string paragraph in paragraphs) 
      { 
       string[] words = paragraph.Split(' '); 

       string line = ""; 
       foreach (string word in words) 
       { 
        if ((line + word).Length > maxCharacters) 
        { 
         lines.Add(line.Trim()); 
         line = ""; 
        } 

        line += string.Format("{0} ", word); 
       } 

       if (line.Length > 0) 
       { 
        lines.Add(line.Trim()); 
       } 
      } 
     } 
     return lines; 
    } 
1

Tôi bắt đầu với Jim H.'s solution và kết thúc bằng phương pháp này. Chỉ có vấn đề là nếu văn bản có bất kỳ từ nào dài hơn giới hạn. Nhưng hoạt động tốt.

public static List<string> GetWordGroups(string text, int limit) 
{ 
    var words = text.Split(new string[] { " ", "\r\n", "\n" }, StringSplitOptions.None); 

    List<string> wordList = new List<string>(); 

    string line = ""; 
    foreach (string word in words) 
    { 
     if (!string.IsNullOrWhiteSpace(word)) 
     { 
      var newLine = string.Join(" ", line, word).Trim(); 
      if (newLine.Length >= limit) 
      { 
       wordList.Add(line); 
       line = word; 
      } 
      else 
      { 
       line = newLine; 
      } 
     } 
    } 

    if (line.Length > 0) 
     wordList.Add(line); 

    return wordList; 
} 
Các vấn đề liên quan