我想截断文本,如果它太长但我需要它来截断整个单词。我做了以下事情:
var mktText = model.Product.MarketingText;
var countChars = mktText.Length;
if (countChars > 180)
{
countChars = countChars - 180;
mktText = mktText.Remove(180, countChars);
mktText = mktText + "...";
}
此代码将最大值设置为180个字符,但会将单词缩减为一半,而不是单词。
任何帮助表示赞赏。
由于
答案 0 :(得分:5)
查找该位置之前的最后一个空格,并在那里剪切字符串。如果根本没有空间,或者文本中的内容太快,那么无论如何只需将其剪切为180.
string mktText = model.Product.MarketingText;
if (mktText.Length > 180) {
int pos = mktText.LastIndexOf(" ", 180);
if (pos < 150) {
pos = 180;
}
mktText = mktText.Substring(0, pos) + "...";
}
答案 1 :(得分:1)
我找到了一个扩展方法,(我真的不记得在哪里),现在它是我的扩展库的一部分
public static class StringExtensions
{
public static string LimitOnWordBoundary(this string str, int count)
{
if (str.Length <= count - 3)
return str;
else
{
int lastspace = str.Substring(0, count - 3).LastIndexOf(' ');
if (lastspace > 0 && lastspace > count - 20)
{
// limits the backward search to a max of 20 chars
return str.Substring(0, lastspace) + "...";
}
else
{
// No space in the last 20 chars, so get all the string minus 3
return str.Substring(0, count - 3) + "...";
}
}
}
}
现在以这种方式打电话
string mktText = model.Product.MarketingText.LimitOnWordBoundary(180);
答案 2 :(得分:1)
要非常小心创建字符串。
尝试这样的事情,而不是:
public static class StringExtensions
{
public static string Truncate(this string text, int length)
{
var sb = new StringBuilder(text);
var i = Math.Min(length, sb.Length);
if ((sb.Length > length) && !char.IsWhiteSpace(sb[i]))
{
while ((--i >= 0) && !char.IsWhiteSpace(sb[i]))
{
}
}
if (i > 0)
{
while ((--i >= 0) && char.IsWhiteSpace(sb[i]))
{
}
}
return sb.ToString(0, i + 1);
}
}
答案 3 :(得分:0)
你需要打破每个单词的文字。并在检查长度的同时合并新文本。
这样的事情:
var listWords = [ORIGINAL_TEXT].Split(' ');
var text = string.empty;
for(var str in listWords)
{
if((text+str).Length > 180)
break;
text +=str + " ";
}
我希望这个想法很明确......这段代码需要修改
答案 4 :(得分:0)
通过一些小的调整,这可以为您提供所需的信息:
编辑 调整后使用您的变量/名称,180表示最大长度等:
var mktText = model.Product.MarketingText;
var cutPos = new string(mktText.Take(180).ToArray()).LastIndexOf(' ');
var result = new string(mktText.Take(cutPos).ToArray());