67

我试图在 C# 中截断一些长文本,但我不希望我的字符串在一个单词中被截断。有没有人有一个函数可以用来在单词末尾截断我的字符串?

例如:

"This was a long string..."

不是:

"This was a long st..."
4

10 回答 10

99

试试下面的。这是相当初级的。只需找到从所需长度开始的第一个空格。

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));
}
于 2009-10-23T14:40:07.987 回答
86

感谢您的回答戴夫。我已经稍微调整了这个功能,这就是我正在使用的......除非有更多评论;)

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());
}
于 2009-10-23T15:07:40.600 回答
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 + 尾随文本长度。

于 2012-09-12T16:21:29.347 回答
4

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

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

于 2009-10-23T14:49:08.907 回答
3

我把你的方法更进一步:

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

我正在使用它来截断推文。

于 2012-02-24T17:37:34.333 回答
3

此解决方案也有效(从 myString 中获取前 10 个单词):

String.Join(" ", myString.Split(' ').Take(10))
于 2016-03-14T11:05:57.913 回答
2

考虑到不仅仅是空格分隔符(例如,单词可以用句点分隔,后跟换行符,后跟制表符等),以及其他几种边缘情况,这里是一种适当的扩展方法:

    public static string GetMaxWords(this string input, int maxWords, string truncateWith = "...", string additionalSeparators = ",-_:")
    {
        int words = 1;
        bool IsSeparator(char c) => Char.IsSeparator(c) || additionalSeparators.Contains(c);

        IEnumerable<char> IterateChars()
        {
            yield return input[0];

            for (int i = 1; i < input.Length; i++)
            {
                if (IsSeparator(input[i]) && !IsSeparator(input[i - 1]))
                    if (words == maxWords)
                    {
                        foreach (char c in truncateWith)
                            yield return c;

                        break;
                    }
                    else
                        words++;

                yield return input[i];
            }
        }

        return !input.IsNullOrEmpty()
            ? new String(IterateChars().ToArray())
            : String.Empty;
    }
于 2020-05-25T11:00:09.097 回答
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;
    }
于 2014-07-24T10:21:32.283 回答
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 };
        }
    }
于 2015-07-25T22:52:04.493 回答
-1

我用这个

public string Truncate(string content, int length)
    {
        try
        {
            return content.Substring(0,content.IndexOf(" ",length)) + "...";
        }
        catch
        {
            return content;
        }
    }
于 2014-08-10T06:50:53.270 回答