1

如果文本太长,我想截断它,但我需要它截断整个单词。我做了以下事情:

 var mktText = model.Product.MarketingText;
            var countChars = mktText.Length;
            if (countChars > 180)
            {
                countChars = countChars - 180;
                mktText = mktText.Remove(180, countChars);
                mktText = mktText + "...";
            }

此代码将最大值设置为 180 个字符,但会将一个单词切成两半,而 i 单词而不是完整的单词。

任何帮助表示赞赏。

谢谢

4

5 回答 5

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) + "...";
}
于 2013-04-26T12:32:49.000 回答
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);
于 2013-04-26T12:39:58.280 回答
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);
    }
}
于 2013-04-26T14:21:49.470 回答
0

您需要在每个单词处打断文本。并在检查长度的同时合并新文本。

像这样的东西:

var listWords = [ORIGINAL_TEXT].Split(' ');
var text = string.empty;
for(var str in listWords)
{
  if((text+str).Length > 180)
     break;
  text +=str + " ";
}

我希望这个想法很清楚......这段代码需要修改

于 2013-04-26T12:30:04.737 回答
0

这应该可以满足您的需求,并进行一些小的调整:

编辑:调整为使用您的变量/名称,最大长度为 180 等:

var mktText = model.Product.MarketingText;
var cutPos = new string(mktText.Take(180).ToArray()).LastIndexOf(' ');
var result = new string(mktText.Take(cutPos).ToArray());
于 2013-04-26T12:38:32.850 回答