Как я могу обрезать мои строки с "...", если они слишком длинные? - PullRequest
68 голосов
/ 17 июля 2011

Надеюсь, у кого-нибудь есть хорошая идея. У меня есть такие строки:

abcdefg
abcde
abc

Что мне нужно, так это чтобы их можно было так растрогать, если они превышают указанную длину:

abc ..
abc ..
abc

Есть ли какой-нибудь простой код C #, который я могу использовать для этого?

Ответы [ 11 ]

120 голосов
/ 17 июля 2011

Вот логика, заключенная в метод расширения:

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));
7 голосов
/ 17 июля 2011
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;
3 голосов
/ 19 декабря 2018

Все очень хорошие ответы, но, чтобы немного убрать их, не разрывайте строку в середине слова.

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;
}
3 голосов
/ 03 января 2018

Вот версия, которая учитывает длину эллипсов:

    public static string Truncate(this string value, int maxChars)
    {
        const string ellipses = "...";
        return value.Length <= maxChars ? value : value.Substring(0, maxChars - ellipses.Length) + ellipses;
    }
3 голосов
/ 17 июля 2011

В .NET Framework нет встроенного метода, который бы делал это, однако это очень простой способ написать самостоятельно. Вот шаги, попробуйте сделать это самостоятельно и дайте нам знать, что вы придумали.

  1. Создать метод, возможно метод расширения public static void TruncateWithEllipsis(this string value, int maxLength)

  2. Проверьте, больше ли переданное значение, чем maxLength, указанное с помощью свойства Length . Если value не больше maxLength, просто верните value.

  3. Если мы не вернули переданное значение как есть, то мы знаем, что нам нужно усечь. Поэтому нам нужно получить меньший фрагмент строки, используя метод SubString . Этот метод будет возвращать меньший раздел строки на основе указанного начального и конечного значения. Конечная позиция - это то, что было передано параметром maxLength, так что используйте это.

  4. Возвращает подраздел строки и многоточие.

Отличным упражнением на будущее будет обновление метода и его прерывание только после полных слов. Вы также можете создать перегрузку, чтобы указать, как вы хотите, чтобы строка была обрезана. Например, метод может возвращать «(нажмите для более)» вместо «...», если ваше приложение настроено на отображение более подробной информации, нажав.

2 голосов
/ 17 июля 2011

Может быть, лучше реализовать метод для этой цели:

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;
}
2 голосов
/ 17 июля 2011

Код:

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>
1 голос
/ 16 января 2018

Я нашел этот вопрос после поиска "C # truncate ellipsis". Используя различные ответы, я создал собственное решение со следующими функциями:

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

Надеюсь, это поможет кому-то еще.

1 голос
/ 17 июля 2011
string s = "abcdefg";
if (s.length > 3)
{
    s = s.substring(0,3);
}

Вы можете использовать функцию Substring.

0 голосов
/ 29 января 2018

У меня недавно была эта проблема.Я сохранял сообщение «status» в поле базы данных nvarcharMAX, которое составляет 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);


        }

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...