截断string在.NET中的整个单词C#
我试图截断C#中的一些长文本,但我不希望我的string被切断一半的一个字。 有没有人有一个function,我可以用来截断我的string在一个字的末尾?
例如:
"This was a long string..."
不:
"This was a long st..."
尝试以下。 这是相当简单的。 只要find所需长度的第一个空间。
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)); }
感谢您的回答戴夫。 我已经调整了一下这个函数,这是我正在使用的…除非有更多的评论;)
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()); }
我的贡献:
public static string TruncateAtWord(string text, int maxCharacters, string trailingStringIfTextCut = "…") { 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 +结尾的文本长度。
如果使用Windows窗体,则在Graphics.DrawString方法中,StringFormat中有一个选项可以指定是否应该截断string,如果不适合指定的区域。 这将根据需要处理添加省略号。
http://msdn.microsoft.com/en-us/library/system.drawing.stringtrimming.aspx
我进一步采取了你的方法:
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) + "..."; }
我正在使用这个来截断推文。
简化,增加了中继字符选项,并将其作为扩展。
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; }
下面是我想出来的。 这是为了让句子的其余部分也分块。
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 }; } }
这个解决scheme也起作用(从myString开始,前10个单词):
String.Join(" ", myString.Split(' ').Take(10))
我用这个
public string Truncate(string content, int length) { try { return content.Substring(0,content.IndexOf(" ",length)) + "..."; } catch { return content; } }