【问题标题】:Truncate middle of String and replace it - Swift截断字符串的中间并替换它 - Swift
【发布时间】:2021-08-01 02:20:07
【问题描述】:

我有一个这样的字符串:

0x829bd824b016326a401d083b33d092293333a830

我想留下前6个字符,留下最后4个:

0x829b...a830

我该怎么做?我在 Apple 文档中看到了 .firstIndex(of: "-") 选项,但那是用于删除特定字符,因此不适用。

【问题讨论】:

  • 你想在标签或其他东西中显示这个吗?在这种情况下,您可以让UILabel 为您完成工作:stackoverflow.com/questions/20417767/…
  • @aheze 我将在 SwiftUI 视图中显示它,很可能在 Text("") 或标签中显示是的,我检查了您提供的链接,但它似乎不适用。唯一类似的选项是 NSLineBreakByTruncatingMiddle 但这只是让它为我做,我想要更具体的,比如把最后 4 和一些数字放在前面

标签: swift swiftui


【解决方案1】:

您可以使用drop 的一种方式,如下所示:

let stringTest: String = "0x829bd824b016326a401d083b33d092293333a830"
    
print(stringTest.replacingOccurrences(of: stringTest.dropFirst(6).dropLast(4), with: "...")) 

// It will print: 0x829b...a830

这里扩展

extension String {
    
    func replacingRange(indexFromStart: Int, indexFromEnd: Int, replacing: String = "") -> Self {
        return self.replacingOccurrences(of: self.dropFirst(indexFromStart).dropLast(indexFromEnd), with: replacing)
    }
    
    func replacingRange2(indexFromStart: Int, indexFromEnd: Int, replacing: String = "") -> Self {
        return String(self.prefix(indexFromStart)) + replacing + String(self.suffix(indexFromEnd))
    }

}

用例:

print(stringTest.replacingRange(indexFromStart: 6, indexFromEnd: 4, replacing: "..."))

来自Leo DabusMaster扩展:

extension StringProtocol where Self: RangeReplaceableCollection {
    
    func replacing<S: StringProtocol>(indexFromStart: Int, indexFromEnd: Int, with string: S = "") -> Self {
        
        Self.init(replacingOccurrences(of: dropFirst(indexFromStart).dropLast(indexFromEnd), with: string))
        
    }
    
    
    func replacing2<S: StringProtocol>(indexFromStart: Int, indexFromEnd: Int, with string: S = "") -> Self {

        Self.init(self.prefix(indexFromStart) + Self(string) + self.suffix(indexFromEnd))
        
    }
    
    func replacing3<S: StringProtocol>(indexFromStart: Int, indexFromEnd: Int, with string: S = "") -> Self {

        Self.init(self.prefix(indexFromStart) + string[...] + self.suffix(indexFromEnd))
        
    }
    
}

【讨论】:

  • @Arturo 你也可以只做str.prefix(6) + "..." + str.suffix(4)。只要确保字符串有足够的字符。
  • 添加到@LeoDabus 如果没有足够的(let str = "asd"),结果将是asd...asd
  • @Arturo:我也添加了扩展。
  • @swiftPunk 最好使用ClosedRange&lt;Int&gt; 并将其命名为replacingRange 或者replacingSubrange
  • 这是返回Self所必需的。如果您想返回String,您可以将其删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多