Как я могу усечь NSString до заданной длины? - PullRequest
65 голосов
/ 01 июня 2010

Я искал, но неожиданно не смог найти ответ.

У меня есть длинная NSString, которую я хочу сократить. Я хочу, чтобы максимальная длина была около 20 символов. Я где-то читал, что лучшим решением является использование substringWithRange. Это лучший способ обрезать строку?

NSRange stringRange = {0,20};
NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
NSString *shortString = [myString substringWithRange:stringRange];

Это кажется немного деликатным (вылетает, если строка короче максимальной длины). Я также не уверен, что это безопасно для Unicode. Есть ли лучший способ сделать это? У кого-нибудь есть хорошая категория для этого?

Ответы [ 10 ]

120 голосов
/ 02 июня 2010

На самом деле часть о том, чтобы быть «безопасным для Юникода», уже устарела, так как многие символы объединяются в Юникоде, что в предложенных ответах не учитывается.

Например, если вы хотите ввести é. Один из способов сделать это - набрать «е» (0x65) + сочетание акцента «́» (0x301). Теперь, если вы наберете «кафе» и урежете 4 символа, вы получите «кафе». Это может вызвать проблемы в некоторых местах.

Если вас это не волнует, другие ответы работают нормально. В противном случае сделайте это:

// define the range you're interested in
NSRange stringRange = {0, MIN([myString length], 20)};

// adjust the range to include dependent chars
stringRange = [myString rangeOfComposedCharacterSequencesForRange:stringRange];

// Now you can create the short string
NSString *shortString = [myString substringWithRange:stringRange];

Обратите внимание, что таким образом ваш диапазон может быть длиннее, чем начальная длина диапазона. В приведенном выше примере с кафе ваш диапазон увеличится до 5, даже если у вас еще есть 4 «глифа». Если вам абсолютно необходимо, чтобы длина была меньше указанной вами, вам необходимо проверить это.

14 голосов
/ 06 марта 2014

Поскольку этого ответа на самом деле нет в этом списке, самый простой и разумный однострочный:

NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
myString = (myString.length > 20) ? [myString substringToIndex:20] : myString;
11 голосов
/ 01 июля 2011

Более короткое решение:

NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
7 голосов
/ 01 июня 2010

Это кажется немного деликатным (вылетает, если строка короче максимальной длины)

Тогда почему бы не исправить эту часть?

NSRange stringRange = {0, MIN([myString length], 20)};
3 голосов
/ 01 июня 2010

Можно использовать троичную операцию:

NSString *shortString = (stringRange.length <= [myString length]) ? myString : [myString substringWithRange:stringRange];

Или для большего контроля над конечным результатом:

if (stringRange.length > [myString length])
    // throw exception, ignore error, or set shortString to myString
else 
    shortString = [myString substringWithRange:stringRange];
2 голосов
/ 11 января 2018

Свифт 4

let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))

Счастливое кодирование.

2 голосов
/ 12 января 2015

Самое простое и приятное решение (с 3 точками в конце текста):

NSString *newText = [text length] > intTextLimit ? 
    [[text substringToIndex:intTextLimit] stringByAppendingString:@"..."] : 
        text;
2 голосов
/ 15 ноября 2013
 //Short the string if string more than 45 chars
    if([self.tableCellNames[indexPath.section] length] > 40) {

        // define the range you're interested in
        NSRange stringRange = {0, MIN([self.tableCellNames[indexPath.section] length], 40)};

        // adjust the range to include dependent chars
        stringRange = [self.tableCellNames[indexPath.section]
                       rangeOfComposedCharacterSequencesForRange:stringRange];

        // Now you can create the short string
        NSString *shortStringTitle = [self.tableCellNames[indexPath.section] substringWithRange:stringRange];

        shortStringTitle = [shortStringTitle stringByAppendingString:@"..."];

        titleLabel.text = shortStringTitle;

    } else {

        titleLabel.text = self.tableCellNames[indexPath.section];
    }

// VKJ

0 голосов
/ 10 сентября 2014

Если вы хотите обрезать от конечного использования:

[fileName substringToIndex:anyNumber];

Если вы хотите усечь с самого начала:

[fileName substringFromIndex:anyNumber];
0 голосов
/ 01 июня 2010

Все операции NSString безопасны для Unicode, поскольку NSString по сути является внутренним массивом unichar. Даже если строка находится в другой кодировке, она отображается во время отображения в заданную кодировку.

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