Надеюсь, у кого-то есть хорошая идея. У меня есть такие строки:
abcdefg
abcde
abc
Мне нужно, чтобы они были показаны таким образом, если длина больше указанной:
abc ..
abc ..
abc
Есть ли какой-нибудь простой код на C #, который я могу использовать для этого?
Char
s в качестве ограничения. К сожалению, графическая ширина может сильно различаться. А еще есть суррогаты UTF-16, объединяющие символы, ...Ответы:
Вот логика, заключенная в метод расширения:
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));
источник
: value.Substring(0, maxChars) + (char)0x2026;
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;
источник
Все очень хорошие ответы, но чтобы немного поправить, если ваши строки являются предложениями, не рвите строку посередине слова.
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; }
источник
LastIndexOf
функция вернет -1 иSubstring
вызовет ошибку времени выполнения.Вот версия, которая учитывает длину эллипсов:
public static string Truncate(this string value, int maxChars) { const string ellipses = "..."; return value.Length <= maxChars ? value : value.Substring(0, maxChars - ellipses.Length) + ellipses; }
источник
const char ellipse = (char)0x2026;
В .NET Framework нет встроенного метода, который бы это делал, однако это очень простой метод, который можно написать самостоятельно. Вот шаги, попробуйте сделать это сами и сообщите нам, что вы придумали.
Создайте метод, возможно, метод расширения
public static void TruncateWithEllipsis(this string value, int maxLength)
Проверьте, не превышает ли переданное значение значение,
maxLength
указанное с помощьюLength
свойства . Еслиvalue
не большеmaxLength
, просто вернитеvalue
.Если мы не вернули переданное значение как есть, значит, мы знаем, что нам нужно усечь. Таким образом, нам нужно получить меньшую часть строки с помощью
SubString
метода . Этот метод вернет меньшую часть строки на основе указанного начального и конечного значения. Конечная позиция - это то, что было переданоmaxLength
параметром, поэтому используйте это.Верните часть строки плюс многоточие.
Отличным упражнением на будущее было бы обновить метод и заставить его останавливаться только после полных слов. Вы также можете создать перегрузку, чтобы указать, как вы хотите, чтобы строка была усечена. Например, метод может возвращать «(щелкните, чтобы узнать больше)» вместо «...», если ваше приложение настроено так, чтобы отображать более подробную информацию при нажатии.
источник
Код позади:
string shorten(sting s) { //string s = abcdefg; int tooLongInt = 3; if (s.Length > tooLongInt) return s.Substring(0, tooLongInt) + ".."; return s; }
Разметка:
источник
Может быть, лучше реализовать для этого метод:
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; }
источник
string s = "abcdefg"; if (s.length > 3) { s = s.substring(0,3); }
Вы можете использовать функцию подстроки.
источник
Я нашел этот вопрос после поиска по запросу "усечение многоточия C #". Используя различные ответы, я создал собственное решение со следующими функциями:
Убедитесь, что строка не пуста и не пуста, прежде чем пытаться ее обрезать.
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; } }
Надеюсь, это поможет кому-то другому.
источник
Конечно, вот пример кода:
string str = "abcdefg"; if (str.Length > X){ str = str.Substring(0, X) + "..."; }
источник
У меня недавно возникла эта проблема. Я хранил сообщение «статус» в поле базы данных 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); }
Надеюсь, это кому-то поможет.
источник