如果字符串太长,如何用“…”截断字符串?


84

希望有人有一个好主意。我有这样的字符串:

abcdefg
abcde
abc

我需要的是,如果超过指定的长度,则必须将它们显示为这样:

abc ..
abc ..
abc

我可以使用任何简单的C#代码吗?


您打算在哪里做?-在Forms或WPF应用程序或网站中-请提供更多详细信息!
巴里·凯

2
大多数解决方案的问题在于它们使用Chars作为限制。不幸的是,图形宽度可以有很大的不同。然后是UTF-16代理,结合了字符,...
CodesInChaos 2011年

12
这不是建议问题的重复。这是一个非常笼统的问题,而建议的重复项是一个非常具体的问题。
JasonMArcher 2011年

2
这绝对不是建议问题的重复。
赛斯

2
这个问题甚至与建议的重复项不符,请删除重复项属性。谢谢。
丹尼尔·莱森

Answers:


146

这是扩展方法中包含的逻辑:

public static string Truncate(this string value, int maxChars)
{
    return value.Length <= maxChars ? value : value.Substring(0, maxChars) + "...";
}

用法:

var s = "abcdefg";

Console.WriteLine(s.Truncate(3));

1
谢谢布莱恩。您的回答看起来不错。请原谅我的简单问题,但如何使用扩展方法?
麦莉

1
@Melony:已编辑以包括用法。
Bryan Watts

11
……(省略号)是那些在乎的人的正确象征。Unicode U + 2026。
Malako '17

3
快速添加以包括空支票
james

1
感谢@Malako: value.Substring(0, maxChars) + (char)0x2026;
Pierre

8
public string TruncString(string myStr, int THRESHOLD)
{
    if (myStr.Length > THRESHOLD)
        return myStr.Substring(0, THRESHOLD) + "...";
    return myStr;
}

忽略命名约定,以防万一他实际上需要THRESHOLD变量或大小始终相同。

或者

string res = (myStr.Length > THRESHOLD) ? myStr.Substring(0, THRESHOLD) + ".." : myStr;

是否可以用一行可以内联的方式使之成为某种东西?
Melony

2
如果它在中间拆分一个代码点,则会产生无效的字符串:(
CodesInChaos 2011年

7

所有的答案都是非常好的,但是,如果您的字符串是句子,只需清理一点,请不要在单词中间打断字符串。

private string TruncateForDisplay(this string value, int length)
{
  if (string.IsNullOrEmpty(value)) return string.Empty;
  var returnValue = value;
  if (value.Length > length)
  {
    var tmp = value.Substring(0, length) ;
    if (tmp.LastIndexOf(' ') > 0)
       returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
  }                
  return returnValue;
}

这是唯一不会打断单词的答案。因此,唯一正确的一个IMO。
mxmissile

@mxmissile-给定OP数据,对于“ abcdefg”,截断为3个字符,转到“ abc ...”,即使此方法有效,也根本不正确。OP样本数据清楚地表明连续文本中间出现硬截断。更糟糕的是,此答​​案将产生错误。由于数据不包含空格,因此LastIndexOf将返回-1,并且Substring将导致运行时错误。

4

这是说明椭圆长度的版本:

    public static string Truncate(this string value, int maxChars)
    {
        const string ellipses = "...";
        return value.Length <= maxChars ? value : value.Substring(0, maxChars - ellipses.Length) + ellipses;
    }

4
如果您使用省略号字符,则无需这样做。它的字符长度将始终为1const char ellipse = (char)0x2026;
Pierre

3

.NET Framework中没有内置方法可以执行此操作,但是这是编写自己的非常简单的方法。这是一些步骤,尝试自己制作,并让我们知道您的想法。

  1. 创建一个方法,也许是一个扩展方法 public static void TruncateWithEllipsis(this string value, int maxLength)

  2. 检查传入的值是否大于maxLength使用Length属性指定的值。如果value不大于maxLength,则返回value

  3. 如果我们没有按原样返回传入的值,那么我们知道需要截断。因此,我们需要使用SubString方法获得字符串的较小部分。该方法将基于指定的开始和结束值返回字符串的较小部分。结束位置是maxLength参数传递的位置,请使用该位置。

  4. 返回字符串的子部分以及省略号。

以后的一个很好的练习是更新该方法,并使它仅在完整的单词后才中断。您还可以创建一个重载以指定显示字符串被截断的方式。例如,如果您的应用程序设置为通过单击显示更多详细信息,则该方法可以返回“(单击更多)”而不是“ ...”。


2

后面的代码:

string shorten(sting s)
{
    //string s = abcdefg;
    int tooLongInt = 3;

    if (s.Length > tooLongInt)
        return s.Substring(0, tooLongInt) + "..";

    return s;
}

标记:

<td><%= shorten(YOUR_STRING_HERE) %></td>

我如何将其放入:“ <td>” +字符串+“ <\ td>”?
Melony

2

也许为此目的实现一个方法更好:

string shorten(sting yourStr)
{
//Suppose you have a string yourStr, toView and a constant value 

    string toView;
    const int maxView = 3;

    if (yourStr.Length > maxView)
        toView = yourStr.Substring(0, maxView) + " ..."; // all you have is to use Substring(int, int) .net method
    else
        toView = yourStr;
return toView;
}

1
string s = "abcdefg";
if (s.length > 3)
{
    s = s.substring(0,3);
}

您可以使用Substring函数。


1

我在搜索“ C#省略号”后发现了这个问题。使用各种答案,我创建了具有以下功能的自己的解决方案:

  1. 扩展方法
  2. 添加省略号
  3. 将省略号设为可选
  4. 在尝试截断字符串之前,请验证该字符串是否为null或为空。

    public static class StringExtensions
    {
        public static string Truncate(this string value, 
            int maxLength, 
            bool addEllipsis = false)
        {
            // Check for valid string before attempting to truncate
            if (string.IsNullOrEmpty(value)) return value;
    
            // Proceed with truncating
            var result = string.Empty;
            if (value.Length > maxLength)
            {
                result = value.Substring(0, maxLength);
                if (addEllipsis) result += "...";
            }
            else
            {
                result = value;
            }
    
            return result;
        }
    }
    

我希望这可以帮助其他人。


0

当然,这是一些示例代码:

string str = "abcdefg";
if (str.Length > X){
   str = str.Substring(0, X) + "...";
}

0

我最近有这个问题。我在nvarcharMAX DB字段中存储了4000个字符的“状态”消息。但是,我的状态消息正在建立并遇到异常。

但这不是截断的简单情况,因为任意截断会孤立状态消息的一部分,所以我确实需要在字符串的一致部分“截断”。

我通过将字符串转换为字符串数组,删除了第一个元素然后恢复为字符串来解决了该问题。这是代码(“ CurrentStatus”是保存数据的字符串)...

        if (CurrentStatus.Length >= 3750)
        {
            // perform some truncation to free up some space.

            // Lets get the status messages into an array for processing...
            // We use the period as the delimiter, then skip the first item and re-insert into an array.

            string[] statusArray = CurrentStatus.Split(new string[] { "." }, StringSplitOptions.None)
                                    .Skip(1).ToArray();

            // Next we return the data to a string and replace any escaped returns with proper one.
            CurrentStatus = (string.Join(".", statusArray))
                                    .Replace("\\r\\n", Environment.NewLine);


        }

希望它可以帮助某人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.