2009-10-23 46 views
56

我想截断C#中的一些长文本,但我不希望我的字符串被切掉部分单词。有没有人有一个功能,我可以用来截断我的字符串在一个字的末尾?在.NET C中的整个单词上截断字符串#

E.g:

"This was a long string..." 

不:

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

可不可以给你目前的解决方案用于截断? – pyrocumulus 2009-10-23 14:38:14

+2

@Cloud只.Substring(0,<字符数>) – TimS 2009-10-23 14:40:24

+2

如果<字符数>高于实际字符串,子字符串将抛出异常,需要额外检查。 – 2010-06-28 09:27:33

回答

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 2009-10-27 12:17:32

+7

请注意,此方法查找第一个空格* AFTER *指定的长度值,几乎总是导致生成的字符串比该值长。 要在长度前查找最后一个空格,只需在计算'iNextSpace'时替换'input.LastIndexOf(“”,length)'。 – CBono 2010-02-14 17:02:55

+3

+100对于CBono的评论 - 这需要在之前!如果长时间使用词汇,那么您将会遇到一些超出我们想要的长度的词汇! – Jason 2010-06-23 16:30:42

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 2009-10-23 14:41:56

+5

找到所需长度之前的第一个空间可能有意义吗?否则,你必须猜测所需的长度是多少? – mlsteeves 2009-10-23 14:46:09

+1

也应该是-1不使用正则表达式;) – Goran 2009-10-23 14:49:07

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) + "..."; 
} 

我用这个来截断推文。

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使用&hellip; :) – manudea 2014-07-13 06:46:28

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 2017-04-02 12:19:29

0

我用这个

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

此解决方案太(取前10个字从myString的):

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