it-swarm.com.ru

Как я могу усечь NSString до заданной длины?

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

У меня есть длинная 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-безопасно. Есть ли лучший способ сделать это? У кого-нибудь есть хорошая категория для этого?

65
nevan king

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

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

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

// 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 «глифа». Если вам абсолютно необходимо, чтобы длина была меньше указанной вами, вы должны проверить это.

119
mohsenr

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

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;
14
brandonscript

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

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

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

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

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

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

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];
3
Alex Reynolds
 //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

2
Vinod Joshi

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

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

Swift 4

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

Удачного кодирования.

1
Md. Ibrahim Hassan

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

[fileName substringToIndex:anyNumber];

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

[fileName substringFromIndex:anyNumber];
0
Gaurav

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

0
Jon Shier