2009-10-23 2 views
56

C#의 일부 긴 텍스트를 잘라내려고하고 있지만 단어를 부분적으로 잘라 내고 싶지 않습니다. 누구든지 단어의 끝에 내 문자열을자를 수있는 함수가 있습니까?.NET에서 전체 단어의 문자열을 자릅니다. C#

예컨대 :

"This was a long string..." 

하지 :

"This was a long st..." 
+1

당신은 절단을 위해 현재의 솔루션을 제공 할 수? – pyrocumulus

+2

@Cloud Just.Substring (0, ) – TimS

+2

가 실제 문자열보다 높으면 하위 문자열이 예외를 throw하여 추가 검사가 필요합니다. –

답변

71

감사합니다. 나는 기능을 조금 쥐게했고 더 이상 설명이 존재하지 않는 한이 내가 ... 사용하고 무엇을)

public static string TruncateAtWord(this string input, int length) 
{ 
    if (input == null || input.Length < length) 
     return input; 
    int iNextSpace = input.LastIndexOf(" ", length, StringComparison.Ordinal); 
    return string.Format("{0}...", input.Substring(0, (iNextSpace > 0) ? iNextSpace : length).Trim()); 
} 
+3

이것에 더하여,이 HTML 태그 내에서 (RegEx를 사용하여) 다른 문자열 유틸리티 함수를 호출하고 있습니다. 이렇게하면 모든 문자열이 일반 텍스트 형식이므로 잘 리면 HTML이 손상 될 위험이 최소화됩니다. – TimS

+7

이 메서드는 지정된 길이 값보다 * 첫 번째 공백을 찾습니다. 거의 항상 결과 문자열을 값보다 길게 만듭니다. 길이 앞에있는 마지막 공간을 찾으려면 단순히'iNextSpace'를 계산할 때'input.LastIndexOf ("", length)'를 대체하십시오. – CBono

+3

CBono의 의견에 대해 +100 - 이전이어야합니다! 이 길이만큼이나 긴 길이의 긴장이 계속되는 동안 당신의 길이는 길어집니다! – Jason

81

는 다음을보십시오. 꽤 초보적입니다. 그냥 원하는 길이로 시작하는 첫 번째 공간을 찾습니다.

public static string TruncateAtWord(this string value, int length) { 
    if (value == null || value.Length < length || value.IndexOf(" ", length) == -1) 
     return value; 

    return value.Substring(0, value.IndexOf(" ", length)); 
} 
+15

완벽! 그리고 시야에 정규식 :) – TimS

+5

원하는 길이 전에 첫 번째 공간을 찾는 것이 합리적일까요? 그렇지 않으면 원하는 길이를 추측해야합니다. – mlsteeves

+1

또한 정규식을 사용하지 않는 경우 -1이되어야합니다.) – Goran

3

당신이 Graphics.DrawString 방법에서, 문자열을 절약 할 수있는 경우는 지정된 영역에 맞지 않는 경우, 지정할 수있는 StringFormat의 옵션이 있습니다, 윈도우 폼을 사용하는 경우. 필요한 경우 줄임표 추가를 처리합니다. 답변 데이브에 대한

http://msdn.microsoft.com/en-us/library/system.drawing.stringtrimming.aspx

+0

이것은 ASP.Net 페이지 용이지만, 알아두면 좋은 Win Forms 자료를 제공합니다! – TimS

2

나는 조금 더 당신의 접근 방식에 나섭니다 :

public string TruncateAtWord(string value, int length) 
{ 
    if (value == null || value.Trim().Length <= length) 
     return value; 

    int index = value.Trim().LastIndexOf(" "); 

    while ((index + 3) > length) 
     index = value.Substring(0, index).Trim().LastIndexOf(" "); 

    if (index > 0) 
     return value.Substring(0, index) + "..."; 

    return value.Substring(0, length - 3) + "..."; 
} 

I을 트윗을 자르기 위해 이것을 사용합니다.

5

내 기여 :

public static string TruncateAtWord(string text, int maxCharacters, string trailingStringIfTextCut = "&hellip;") 
{ 
    if (text == null || (text = text.Trim()).Length <= maxCharacters) 
     return text; 

    int trailLength = trailingStringIfTextCut.StartsWith("&") ? 1 
                   : trailingStringIfTextCut.Length; 
    maxCharacters = maxCharacters - trailLength >= 0 ? maxCharacters - trailLength 
                : 0; 
    int pos = text.LastIndexOf(" ", maxCharacters); 
    if (pos >= 0) 
     return text.Substring(0, pos) + trailingStringIfTextCut; 

    return string.Empty; 
} 

이 내가 선택 후행과 함께, 내 프로젝트에 사용할 것입니다. 텍스트는 maxCharacters + 텍스트 길이를 초과하지 않습니다.

+0

+1; :) – manudea

1

단순화되고 트렁킹 문자 옵션이 추가되어 확장되었습니다.

public static string TruncateAtWord(this string value, int maxLength) 
    { 
     if (value == null || value.Trim().Length <= maxLength) 
      return value; 

     string ellipse = "..."; 
     char[] truncateChars = new char[] { ' ', ',' }; 
     int index = value.Trim().LastIndexOfAny(truncateChars); 

     while ((index + ellipse.Length) > maxLength) 
      index = value.Substring(0, index).Trim().LastIndexOfAny(truncateChars); 

     if (index > 0) 
      return value.Substring(0, index) + ellipse; 

     return value.Substring(0, maxLength - ellipse.Length) + ellipse; 
    } 
+0

이것은 의도 한대로 작동하지 않습니다. 여기에 아무것도 게시하기 전에 최소한 정신 테스트를하십시오. – avs099

0

나는 내가 생각 해낸 Heres는 무엇을이

public string Truncate(string content, int length) 
    { 
     try 
     { 
      return content.Substring(0,content.IndexOf(" ",length)) + "..."; 
     } 
     catch 
     { 
      return content; 
     } 
    } 
1

사용합니다. 이것은 문장의 나머지 부분을 청크로 가져 오는 것입니다. 이 솔루션은 너무 작동

public static List<string> SplitTheSentenceAtWord(this string originalString, int length) 
    { 
     try 
     { 
      List<string> truncatedStrings = new List<string>(); 
      if (originalString == null || originalString.Trim().Length <= length) 
      { 
       truncatedStrings.Add(originalString); 
       return truncatedStrings; 
      } 
      int index = originalString.Trim().LastIndexOf(" "); 

      while ((index + 3) > length) 
       index = originalString.Substring(0, index).Trim().LastIndexOf(" "); 

      if (index > 0) 
      { 
       string retValue = originalString.Substring(0, index) + "..."; 
       truncatedStrings.Add(retValue); 

       string shortWord2 = originalString; 
       if (retValue.EndsWith("...")) 
       { 
        shortWord2 = retValue.Replace("...", ""); 
       } 
       shortWord2 = originalString.Substring(shortWord2.Length); 

       if (shortWord2.Length > length) //truncate it further 
       { 
        List<string> retValues = SplitTheSentenceAtWord(shortWord2.TrimStart(), length); 
        truncatedStrings.AddRange(retValues); 
       } 
       else 
       { 
        truncatedStrings.Add(shortWord2.TrimStart()); 
       } 
       return truncatedStrings; 
      } 
      var retVal_Last = originalString.Substring(0, length - 3); 
      truncatedStrings.Add(retVal_Last + "..."); 
      if (originalString.Length > length)//truncate it further 
      { 
       string shortWord3 = originalString; 
       if (originalString.EndsWith("...")) 
       { 
        shortWord3 = originalString.Replace("...", ""); 
       } 
       shortWord3 = originalString.Substring(retVal_Last.Length); 
       List<string> retValues = SplitTheSentenceAtWord(shortWord3.TrimStart(), length); 

       truncatedStrings.AddRange(retValues); 
      } 
      else 
      { 
       truncatedStrings.Add(retVal_Last + "..."); 
      } 
      return truncatedStrings; 
     } 
     catch 
     { 
      return new List<string> { originalString }; 
     } 
    } 
1

은 (MyString의에서 처음으로 10 개 단어 소요) :

String.Join(" ", myString.Split(' ').Take(10))