代码之家  ›  专栏  ›  技术社区  ›  TimS

在.NET C中截断整词的字符串#

  •  61
  • TimS  · 技术社区  · 15 年前

    我试图用C截断一些长文本,但我不希望通过一个词将字符串部分截断。是否有人有一个函数可以用来在单词末尾截断字符串?

    例如:

    "This was a long string..."
    

    不是:

    "This was a long st..."
    
    9 回复  |  直到 7 年前
        1
  •  88
  •   Annie    11 年前

    尝试以下操作。这是相当初级的。只需找到从所需长度开始的第一个空间。

    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));
    }
    
        2
  •  77
  •   Shiva    7 年前

    谢谢你的回答,戴夫。我对函数做了一些调整,这就是我使用的…除非另有评论;)

    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
  •  5
  •   bluish dmajkic    11 年前

    我的贡献:

    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;
    }
    

    这是我在我的项目中使用的,带有可选的尾部。文本永远不会超过最大字符数+尾随文本长度。

        4
  •  4
  •   mlsteeves    15 年前

    如果使用的是Windows窗体,则在graphics.drawstring方法中,有一个StringFormat选项可以指定如果字符串不适合指定的区域,是否应截断该字符串。这将在必要时处理添加省略号。

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

        5
  •  3
  •   user1795248    8 年前

    这个解决方案也有效(从mystring中提取前10个单词):

    String.Join(" ", myString.Split(' ').Take(10))
    
        6
  •  2
  •   Douglas Ludlow    12 年前

    我把你的方法再进一步一点:

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

    我用这个来截短tweets。

        7
  •  1
  •   Leon van Wyk    10 年前

    简化,增加了中继字符选项,并使其成为扩展。

        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;
        }
    
        8
  •  1
  •   Rahul Sonthalia    9 年前

    这就是我的想法。这是为了让句子的其余部分也成块。

    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 };
            }
        }
    
        9
  •  -1
  •   Zhou Hai    10 年前

    我用这个

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