Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何将NSString截断为设置的长度?_Iphone_Objective C_Cocoa_String - Fatal编程技术网

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