我想截断C#中的一些长文本,但我不希望我的字符串被切掉部分单词。有没有人有一个功能,我可以用来截断我的字符串在一个字的末尾?在.NET C中的整个单词上截断字符串#
E.g:
"This was a long string..."
不:
"This was a long st..."
我想截断C#中的一些长文本,但我不希望我的字符串被切掉部分单词。有没有人有一个功能,我可以用来截断我的字符串在一个字的末尾?在.NET C中的整个单词上截断字符串#
E.g:
"This was a long string..."
不:
"This was a long st..."
谢谢您的回答戴夫。我已经调整了功能了一下,这是我使用的是什么?如果没有任何更多的评论;)
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());
}
除此之外,我现在还在调用另一个字符串实用程序函数,它会去掉任何HTML标记(使用RegEx)。这可以最大限度地减少由于截断导致断开HTML的风险,因为所有字符串都将以纯文本格式显示。 – TimS 2009-10-27 12:17:32
请注意,此方法查找第一个空格* AFTER *指定的长度值,几乎总是导致生成的字符串比该值长。 要在长度前查找最后一个空格,只需在计算'iNextSpace'时替换'input.LastIndexOf(“”,length)'。 – CBono 2010-02-14 17:02:55
+100对于CBono的评论 - 这需要在之前!如果长时间使用词汇,那么您将会遇到一些超出我们想要的长度的词汇! – Jason 2010-06-23 16:30:42
尝试以下。这是相当简陋的。只需找到从所需长度开始的第一个空间。
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));
}
如果使用的是Windows窗体,在Graphics.DrawString方法,存在的StringFormat,指定,如果它不适合指定的区域,如果该字符串应该被截断的选项。这将根据需要处理添加省略号。
http://msdn.microsoft.com/en-us/library/system.drawing.stringtrimming.aspx
这是一个ASP.Net页面,但我做了一些Win Forms的东西,非常好知道! – TimS 2009-10-23 14:53:52
我把你方法远一点:
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(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 +结尾文字长度。
+1使用&hellip; :) – manudea 2014-07-13 06:46:28
简化,增加了中继字符选项,并将其作为扩展。
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;
}
这根本无法按预期工作。在发布任何东西之前,请至少做一次健全性检查。 – avs099 2017-04-02 12:19:29
我用这个
public string Truncate(string content, int length)
{
try
{
return content.Substring(0,content.IndexOf(" ",length)) + "...";
}
catch
{
return content;
}
}
继承人什么我想出了。这是为了让句子的其余部分也以大块的形式出现。
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 };
}
}
此解决方案太(取前10个字从myString的):
String.Join(" ", myString.Split(' ').Take(10))
可不可以给你目前的解决方案用于截断? – pyrocumulus 2009-10-23 14:38:14
@Cloud只.Substring(0,<字符数>) – TimS 2009-10-23 14:40:24
如果<字符数>高于实际字符串,子字符串将抛出异常,需要额外检查。 – 2010-06-28 09:27:33