如何在swift中每N个字符添加分隔符到字符串?

Bol*_*olo 24 string character ios swift

我有一个包含二进制数字的字符串.如何将其分成数字对?

假设字符串是:

let x = "11231245"
Run Code Online (Sandbox Code Playgroud)

我想在每2个字符后面添加一个分隔符,例如":"(即冒号).

我希望输出为:

"11:23:12:45"
Run Code Online (Sandbox Code Playgroud)

我怎么能在Swift中这样做?

Leo*_*bus 54

Swift 4.2•Xcode 10

extension Collection {
    var pairs: [SubSequence] {
        var startIndex = self.startIndex
        let count = self.count
        let n = count/2 + count % 2
        return (0..<n).map { _ in
            let endIndex = index(startIndex, offsetBy: 2, limitedBy: self.endIndex) ?? self.endIndex
            defer { startIndex = endIndex }
            return self[startIndex..<endIndex]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
extension Collection {
    func distance(to index: Index) -> Int { distance(from: startIndex, to: index) }
}
Run Code Online (Sandbox Code Playgroud)

测试

extension StringProtocol where Self: RangeReplaceableCollection {
    mutating func insert<S: StringProtocol>(separator: S, every n: Int) {
        for index in indices.dropFirst().reversed()
            where distance(to: index).isMultiple(of: n) {
            insert(contentsOf: separator, at: index)
        }
    }
    func inserting<S: StringProtocol>(separator: S, every n: Int) -> Self {
        var string = self
        string.insert(separator: separator, every: n)
        return string
    }
}
Run Code Online (Sandbox Code Playgroud)


Sté*_*uca 16

我会选择这个紧凑的解决方案(在Swift 4中):

let s = "11231245"
let r = String(s.enumerated().map { $0 > 0 && $0 % 2 == 0 ? [":", $1] : [$1]}.joined())
Run Code Online (Sandbox Code Playgroud)

您可以进行扩展并参数化步幅和分隔符,以便您可以将它用于您想要的每个值(在我的情况下,我使用它来转储32位空间操作的十六进制数据):

extension String {
    func separate(every stride: Int = 4, with separator: Character = " ") -> String {
        return String(enumerated().map { $0 > 0 && $0 % stride == 0 ? [separator, $1] : [$1]}.joined())
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,这给出了以下结果:

let x = "11231245"
print (x.separate(every:2, with: ":")

$ 11:23:12:45
Run Code Online (Sandbox Code Playgroud)

  • 我的xcode在声明函数时要求返回,如下所示:func separate(每个步幅:Int = 4,带分隔符:Character ="") - > String { (2认同)

Joe*_*her 10

简短而简单,let如果你愿意,可以添加一两个

extension String {

    func separate(every: Int, with separator: String) -> String {
        return String(stride(from: 0, to: Array(self).count, by: every).map {
            Array(Array(self)[$0..<min($0 + every, Array(self).count)])
        }.joined(separator: separator))
    }
}
Run Code Online (Sandbox Code Playgroud)

let a = "separatemepleaseandthankyou".separate(every: 4, with: " ")

a

分开mepl轻松和你


Mih*_*aiL 8

斯威夫特 5.3

    /// Adds a separator at every N characters
    /// - Parameters:
    ///   - separator: the String value to be inserted, to separate the groups. Default is " " - one space.
    ///   - stride: the number of characters in the group, before a separator is inserted. Default is 4.
    /// - Returns: Returns a String which includes a `separator` String at every `stride` number of characters.
    func separated(by separator: String = " ", stride: Int = 4) -> String {
        return enumerated().map { $0.isMultiple(of: stride) && ($0 != 0) ? "\(separator)\($1)" : String($1) }.joined()
    }
Run Code Online (Sandbox Code Playgroud)


luk*_*302 7

我对该代码的尝试将是:

func insert(seperator: String, afterEveryXChars: Int, intoString: String) -> String {
    var output = ""
    intoString.characters.enumerate().forEach { index, c in
        if index % afterEveryXChars == 0 && index > 0 {
            output += seperator
        }
        output.append(c)
    }
    return output
}

insert(":", afterEveryXChars: 2, intoString: "11231245")
Run Code Online (Sandbox Code Playgroud)

哪个输出

11:23:12:45


cou*_*elk 7

let y = String(
    x.characters.enumerate().map() {
        $0.index % 2 == 0 ? [$0.element] : [$0.element, ":"]
    }.flatten()
)
Run Code Online (Sandbox Code Playgroud)

  • @LeoDabus,no,如果原始字符串是奇数长度,dropLast将消耗有效负载字符. (2认同)

小智 7

它是我的代码迅速4

let x = "11231245"

var newText = String()
    for (index, character) in x.enumerated() {
        if index != 0 && index % 2 == 0 {
            newText.append(":")
        }
        newText.append(String(character))
    }
    print(newText)
Run Code Online (Sandbox Code Playgroud)

输出11:23:12:45

  • `newText.append(character)` (2认同)

小智 6

用于插入分隔符的简单一行代码(Swift 4.2):-

let testString = "123456789"

let ansTest = testString.enumerated().compactMap({ ($0 > 0) && ($0 % 2 == 0) ? ":\($1)" : "\($1)" }).joined() ?? ""
print(ansTest) // 12:34:56:78:9
Run Code Online (Sandbox Code Playgroud)


cho*_*fie 5

斯威夫特 4.2.1 - Xcode 10.1

extension String {

    func insertSeparator(_ separatorString: String, atEvery n: Int) -> String {
        guard 0 < n else { return self }
        return self.enumerated().map({String($0.element) + (($0.offset != self.count - 1 && $0.offset % n ==  n - 1) ? "\(separatorString)" : "")}).joined()
    }

    mutating func insertedSeparator(_ separatorString: String, atEvery n: Int) {
        self = insertSeparator(separatorString, atEvery: n)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

let testString = "11231245"

let test1 = testString.insertSeparator(":", atEvery: 2)
print(test1) // 11:23:12:45

var test2 = testString
test2.insertedSeparator(",", atEvery: 3)
print(test2) // 112,312,45    
Run Code Online (Sandbox Code Playgroud)