如果它们太长,我如何用“...”截断我的字符串?

时间:2011-07-17 15:30:13

标签: c# string

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

abcdefg
abcde
abc

我需要的是,如果超过指定的长度,他们就会被宣誓这样显示:

abc ..
abc ..
abc

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

11 个答案:

答案 0 :(得分:117)

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

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 :(得分:7)

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;

答案 2 :(得分:3)

.NET Framework中没有内置方法来执行此操作,但这是一种非常简单的自己编写方法。以下是步骤,尝试自己制作,让我们知道你想出了什么。

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

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

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

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

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

答案 3 :(得分:3)

这是一个考虑省略号长度的版本:

theor_err = [ sqrt(abs(x)) for x in theor_df[str(INTENSITY)] ]
theor_err = np.asarray(theor_err)

for nr_sample in range(2):
    sample = np.zeros(len(theor_df[str(INTENSITY)]))
    for i, error in enumerate(theor_err):
        sample[i] = theor_df[str(INTENSITY)][i] + random.uniform(-error, error)
        theor_df['gen_{}'.format(nr_sample)] = Series(sample, index=theor_df.index)
theor_df.head()

答案 4 :(得分:3)

所有非常好的答案,但是要清理一点,不要在单词中间打断字符串。

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) ;
    returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
  }                
  return returnValue;
}

答案 5 :(得分: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>

答案 6 :(得分: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;
}

答案 7 :(得分:1)

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

您可以使用子串函数。

答案 8 :(得分:1)

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

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

    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;
        }
    }
    
  5. 我希望这有助于其他人。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

我最近有这个问题。我正在存储&#34;状态&#34; nvarcharMAX数据库字段中的消息,长度为4000个字符。但是我的状态消息正在建立并触发异常。

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

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

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


        }

希望能帮助别人。