我怎样才能截断一个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];