Iphone 如何将NSString截断为设置的长度?
我搜索了一下,但出乎意料地没有找到答案 我有一个长的Iphone 如何将NSString截断为设置的长度?,iphone,objective-c,cocoa,string,Iphone,Objective C,Cocoa,String,我搜索了一下,但出乎意料地没有找到答案 我有一个长的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 *sho
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];
这似乎有点微妙(如果字符串短于最大长度,则会崩溃)。我也不确定它是否安全。有更好的方法吗?有人对此有好的分类吗?可以使用三元运算:
NSString *shortString = (stringRange.length <= [myString length]) ? myString : [myString substringWithRange:stringRange];
它似乎有点微妙(如果字符串短于最大长度,则会崩溃)
那为什么不把那部分修好呢
NSRange stringRange = {0, MIN([myString length], 20)};
所有NSString操作都是Unicode安全的,因为NSString本质上是内部的unichar数组。即使字符串在一个不同的编码中,当它被显示时,它也被转换成指定的编码。 < P>实际上,“Unicode安全”的部分已经死了,因为在Unicode中许多字符组合,建议的答案不考虑。 例如,如果您想键入é。一种方法是键入“e”(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];
请注意,这样您的范围可能会比初始范围长度长。在上面的café示例中,您的范围将扩展到5的长度,即使您仍然有4个“glyphs”。如果您确实需要长度小于您指定的长度,则需要对此进行检查。较短的解决方案是:
NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
//VKJ因为这个答案实际上不在这个列表中,所以最简单、最合理的一行:
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;
如果要从最终用途截断,请执行以下操作:
[fileName substringToIndex:anyNumber];
如果要从一开始截断,请执行以下操作:
[fileName substringFromIndex:anyNumber];
最简单、最好的解决方案(文本末尾有3个点): 斯威夫特4
快乐编码。在不同位置(头部、尾部或中部)截断的扩展 Swift 4.2及更新版本
extension String {
enum TruncationPosition {
case head
case middle
case tail
}
func truncated(limit: Int, position: TruncationPosition = .tail, leader: String = "...") -> String {
guard self.count >= limit else { return self }
switch position {
case .head:
return leader + self.suffix(limit)
case .middle:
let halfCount = (limit - leader.count).quotientAndRemainder(dividingBy: 2)
let headCharactersCount = halfCount.quotient + halfCount.remainder
let tailCharactersCount = halfCount.quotient
return String(self.prefix(headCharactersCount)) + leader + String(self.suffix(tailCharactersCount))
case .tail:
return self.prefix(limit) + leader
}
}
}
…
-substringToIndex:
?相关,通过字节计数而不是组合字符进行截断:实际上,不,它并不完全是Unicode安全的,因为某些Unicode字符使用多个unichar。您希望避免在这样的序列中间分割字符串。因此需要像rangeOfComposedCharacterSequenceAtIndex:
这样的方法。谢谢你的回答。你提到的日本汉字是否受到组合口音问题的影响?从使用您的解决方案来看,它似乎可以很好地使用汉字。我恐怕不太熟悉汉字,但我想它们都是单字符(unicode 0x4E00到0x9FAF),所以它们不需要这个。但是,我也不确定…@mohsenr,我刚刚用“café”在截断前后(使用OP的解)进行了测试,两者的长度都是4。我认为iOS将“e”视为单个字符!!!”é'=0xE9和é'=0x65 0x301。如果第一种情况下你在第二种情况下得到长度4。太好了!因为我不能编辑一个字符的打字错误,所以我将它放在这里:[myString subStringToIndex:20];应该是[myString substringToIndex:20];如果myString.lengh
高于20
,我将抛出一个异常。您必须在测试之前测试它,而不是使用“…”(选项+;)这只需要一个字符的3个点。
[fileName substringFromIndex:anyNumber];
NSString *newText = [text length] > intTextLimit ?
[[text substringToIndex:intTextLimit] stringByAppendingString:@"..."] :
text;
let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))
extension String {
enum TruncationPosition {
case head
case middle
case tail
}
func truncated(limit: Int, position: TruncationPosition = .tail, leader: String = "...") -> String {
guard self.count >= limit else { return self }
switch position {
case .head:
return leader + self.suffix(limit)
case .middle:
let halfCount = (limit - leader.count).quotientAndRemainder(dividingBy: 2)
let headCharactersCount = halfCount.quotient + halfCount.remainder
let tailCharactersCount = halfCount.quotient
return String(self.prefix(headCharactersCount)) + leader + String(self.suffix(tailCharactersCount))
case .tail:
return self.prefix(limit) + leader
}
}
}