【问题标题】:How can I truncate my strings with a "..." if they are too long?如果字符串太长,如何用“...”截断字符串?
【发布时间】:2019-10-07 05:45:37
【问题描述】:

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

abcdefg
abcde
abc

如果超过指定长度,我需要将它们截断以显示如下:

abc ..
abc ..
abc

是否有任何简单的 C# 代码可供我使用?

【问题讨论】:

  • 你想在哪里做这个? - 在表单或 WPF 应用程序或网站中 - 请提供更多详细信息!
  • 大多数解决方案的问题是他们使用多个Chars 作为限制。不幸的是,图形宽度变化很大。然后是 UTF-16 代理,组合字符,...
  • 这不是建议问题的重复。这是一个非常笼统的问题,而建议的副本是一个非常具体的问题。
  • 这绝对不是建议问题的重复。
  • 这个问题甚至不接近建议的重复请删除重复属性。谢谢。

标签: c# string


【解决方案1】:

以下是扩展方法中的逻辑:

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));

【讨论】:

  • 谢谢布莱恩。你的答案看起来不错。请原谅我的简单问题,但我该如何使用扩展方法?
  • @Melony:已编辑以包含使用情况。
  • ...(省略号)是关心的人的正确符号。 Unicode U+2026。
  • 快速添加以包括空检查
  • 感谢@Malako : value.Substring(0, maxChars) + (char)0x2026;
【解决方案2】:

所有很好的答案,但要稍微清理一下,如果你的字符串是句子,不要在单词中间打断你的字符串。

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 - 给定 OP 数据,对于“abcdefg”,在 3 个字符处截断,转到“abc ...”,即使这样有效,也完全不正确。 OP 样本数据清楚地表明了连续文本中间的硬截断。更糟糕的是,这个答案会产生错误。由于数据不包含空格,LastIndexOf 将返回 -1,Substring 将导致运行时错误。
【解决方案3】:
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;

【讨论】:

  • 是否有可能用一行可以内联使用的东西?
  • 如果它在中间分割一个代码点会产生无效的字符串:(
【解决方案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;
    }

【讨论】:

  • 如果你使用省略号,那么就没有必要了。它的字符长度将始终为 1 const char ellipse = (char)0x2026;
【解决方案5】:

.NET Framework 中没有内置的方法可以做到这一点,但是这是一个非常容易编写的方法。以下是步骤,请尝试自己制作并告诉我们您的想法。

  1. 创建一个方法,可能是extension methodpublic static void TruncateWithEllipsis(this string value, int maxLength)

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

  3. 如果我们没有按原样返回传入的值,那么我们知道我们需要截断。所以我们需要使用SubString method 来获取字符串的一小部分。该方法将根据指定的开始和结束值返回字符串的较小部分。结束位置是maxLength 参数传入的位置,所以使用它。

  4. 返回字符串的子部分加上省略号。

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

【讨论】:

    【解决方案6】:

    后面的代码:

    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>
    

    【讨论】:

    • 我怎么能把它放进去:"" + string + "" ?
    【解决方案7】:

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

    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;
    }
    

    【讨论】:

      【解决方案8】:

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

      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;
            }
        }
        

      我希望这对其他人有帮助。

      【讨论】:

        【解决方案9】:
        string s = "abcdefg";
        if (s.length > 3)
        {
            s = s.substring(0,3);
        }
        

        您可以使用 Substring 函数。

        【讨论】:

          【解决方案10】:

          当然,这里有一些示例代码:

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

          【讨论】:

            【解决方案11】:

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

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

            我通过将字符串转换为字符串数组、删除第一个元素然后恢复为字符串来解决了这个问题。这是代码(“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);
            
            
                    }
            

            希望它可以帮助某人。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-12
              • 2011-02-16
              • 2012-12-04
              • 1970-01-01
              相关资源
              最近更新 更多