Как я могу обрезать NSString на заданную длину?

Я искал, но на удивление не нашел ответа.

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

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

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

Ответ 1

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

Например, если вы хотите ввести é. Один из способов сделать это - набрать "e" (0x65) + сочетание акцента "(0x301). Теперь, если вы наберете" café ", как это, и обрезайте 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 "глифа". Если вам абсолютно необходимо иметь длину меньше, чем указано, вам нужно проверить это.

Ответ 2

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

NSString *myString = @"This is a string, it a very long string, it a very long string indeed";
myString = (myString.length > 20) ? [myString substringToIndex:20] : myString;

Ответ 3

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

NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);

Ответ 4

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

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

NSRange stringRange = {0, MIN([myString length], 20)};

Ответ 5

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

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

Ответ 6

 //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

Ответ 7

Простейшее и приятное решение (с "..." в конце текста):

NSString *newText = [oldText length] > intTextLimit ? [[oldText substringToIndex:intTextLimit] stringByAppendingString:@"..."] : oldText;

Ответ 8

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

Ответ 9

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

[fileName substringToIndex:anyNumber];

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

[fileName substringFromIndex:anyNumber];