Подтвердить что ты не робот

Как я могу усечь свои строки с помощью "...", если они слишком длинны?

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

abcdefg
abcde
abc

Мне нужно, чтобы они были убеждены, чтобы показать это, если это больше, чем заданная длина:

abc ..
abc ..
abc

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

4b9b3361

Ответ 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));

Ответ 2

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

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

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

Ответ 4

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

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

  • Проверьте, превышает ли переданное значение значение maxLength, используя свойство Length. Если value не больше maxLength, просто верните value.

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

  • Верните дополнительный раздел строки плюс многоточие.

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

Ответ 5

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

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

Ответ 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>

Ответ 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

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

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

Ответ 9

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

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

Я надеюсь, что это помогает кому-то еще.

Ответ 10

Конечно, вот пример кода:

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

Ответ 11

У меня эта проблема недавно. Я сохранял сообщение "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);


        }

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