Created
March 14, 2018 17:37
-
-
Save to4iki/f6cf7d02387adb4c7b1b61f11ce727dd to your computer and use it in GitHub Desktop.
string truncate extension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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