Skip to content

Instantly share code, notes, and snippets.

@to4iki
Created March 14, 2018 17:37
Show Gist options
  • Save to4iki/f6cf7d02387adb4c7b1b61f11ce727dd to your computer and use it in GitHub Desktop.
Save to4iki/f6cf7d02387adb4c7b1b61f11ce727dd to your computer and use it in GitHub Desktop.
string truncate extension
import Foundation
// https://qiita.com/risuke/items/cdd6a75f236faae3ce6b
// https://gist.github.com/budidino/8585eecd55fd4284afaaef762450f98e
extension String {
enum TruncationPosition {
case head
case middle
case tail
}
func truncated(with position: TruncationPosition, limit: Int, leader: String = "...") -> String {
guard self.count > limit else { return self }
switch position {
case .head:
return leader + self.suffix(limit)
case .middle:
let headCharactersCount = Int(ceil(Float(limit - leader.count) / 2.0))
let tailCharactersCount = Int(floor(Float(limit - leader.count) / 2.0))
return "\(self.prefix(headCharactersCount))\(leader)\(self.suffix(tailCharactersCount))"
case .tail:
return self.prefix(limit) + leader
}
}
/// 文字列を切り取って任意個数分を置換する
/// - Parameters:
/// - position: 切り取り位置
/// - limit: 処理対象とする文字数
/// - count: 置き換える文字数
/// - leader: 置き換え文字
func truncatedToReplace(with position: TruncationPosition,
limit: Int,
count: Int = 3,
leader: Character = ".") -> String {
guard self.count > limit else { return self }
let replacing = String(repeating: leader, count: count)
switch position {
case .head:
return replacing + self.suffix(limit - count)
case .middle:
let headCharactersCount = Int(ceil(Float(limit - count) / 2.0))
let tailCharactersCount = Int(floor(Float(limit - count) / 2.0))
return "\(self.prefix(headCharactersCount))\(replacing)\(self.suffix(tailCharactersCount))"
case .tail:
return self.prefix(limit - count) + replacing
}
}
}
// MARK: - exec
let str = "abcdefghij01234567890" // count 20
str.truncated(with: .head, limit: 10) // "...1234567890"
str.truncated(with: .middle, limit: 10) // "abcd...890"
str.truncated(with: .tail, limit: 10) // "abcdefghij..."
str.truncatedToReplace(with: .head, limit: 10) // "...4567890"
str.truncatedToReplace(with: .middle, limit: 10) // "abcd...890"
str.truncatedToReplace(with: .tail, limit: 10) // "abcdefg..."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment