代码之家  ›  专栏  ›  技术社区  ›  nevan king

如何将NSString截断为设置的长度?

  •  65
  • nevan king  · 技术社区  · 16 年前

    我搜索了一下,但意外地找不到答案。

    我有很长的路要走 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];
    

    这似乎有点微妙(崩溃,如果字符串短于最大长度)。我也不确定它是否安全。有更好的方法吗?有人对此有好的分类吗?

    10 回复  |  直到 16 年前
        1
  •  123
  •   mohsenr    16 年前

    例如,如果要键入。一种方法是键入“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”。如果你绝对需要一个长度小于你所说的,你需要检查这个。

        2
  •  15
  •   brandonscript    11 年前

    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;
    
        3
  •  15
  •   Community Mohan Dere    6 年前

    斯威夫特4

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

        4
  •  11
  •   Jon Chetan Kalore    15 年前

    较短的解决方案是:

    NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
    
        5
  •  7
  •   Shaggy Frog    16 年前

    似乎有点微妙(如果字符串短于最大长度,则崩溃)

    那为什么不把那部分修好呢?

    NSRange stringRange = {0, MIN([myString length], 20)};
    
        6
  •  3
  •   Alex Reynolds    16 年前

    可以使用三元运算:

    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];
    
        7
  •  3
  •   Yossi    8 年前

    最简单、最好的解决方案(文本末尾有3个点):

    NSString *newText = [text length] > intTextLimit ? 
        [[text substringToIndex:intTextLimit] stringByAppendingString:@"..."] : 
            text;
    
        8
  •  2
  •   Vinod Joshi    12 年前
     //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];
        }
    

        9
  •  2
  •   Cœur Gustavo Armenta    6 年前

    在不同位置(头部、尾部或中部)截断的延伸。

    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
            }
        }
    }
    
        10
  •  0
  •   Jon Shier    16 年前

        11
  •  0
  •   James Zaghini Gandalf    11 年前

    如果要从最终用途截断:

    [fileName substringToIndex:anyNumber];
    

    [fileName substringFromIndex:anyNumber];