我怎样才能截断一个NSString到一个设定的长度?

我搜查,但令人惊讶的找不到答案。

我有一个很长的NSString ,我想缩短。 我想要的最大长度是20个字符左右。 我读的地方是最好的解决scheme是使用substringWithRange 。 这是截断string的最好方法吗?

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

这似乎有点微妙(如果string比最大长度短,就会崩溃)。 我也不确定它是否是Unicode安全的。 有没有更好的方法来做到这一点? 有没有人有这个好的类别?

实际上关于“Unicode安全”的部分是死的,因为许多人物在unicode中并没有考虑到build议的答案。

例如,如果你想inputé。 其中一种方法是input“e”(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]; 

请注意,这样,您的范围可能会比您的初始范围长度更长。 在上面的咖啡厅示例中,即使您仍然有4个“字形”,您的范围也会扩展为5。 如果您绝对需要的长度小于您所指定的长度,则需要检查这一点。

由于这个答案实际上并不在这个列表中,所以最简单也是最明智的一行:

 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; 

较短的解决scheme是:

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

似乎有点微妙(如果string比最大长度短)

那为什么不修理那部分?

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

可以使用三元操作:

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

最简单和最好的解决scheme(在文本的末尾加上“…”):

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

所有的NSString操作都是Unicode安全的,因为NSString本质上是一个unichar数组。 即使string采用了不同的编码,在显示时也会将其转换为指定的编码。

如果你想从最终使用截断:

 [fileName substringToIndex:anyNumber]; 

如果你想从开始截断:

 [fileName substringFromIndex:anyNumber];