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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/34454532/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 08:28:23  来源:igfitidea点击:

How add separator to string at every N characters in swift?

iosstringswiftcharacter

提问by Bolo

I have a string which contains binary digits. How to separate it in to pairs of digits?

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

Suppose the string is:

假设字符串是:

let x = "11231245"

I want to add a separator such as ":" (i.e., a colon) after each 2 characters.

我想在每 2 个字符后添加一个分隔符,例如“:”(即冒号)。

I would like the output to be:

我希望输出是:

"11:23:12:45"

How could I do this in Swift ?

我怎么能在 Swift 中做到这一点?

回答by Leo Dabus

Swift 5.1 ? Xcode 11 or later

斯威夫特 5.1 ? Xcode 11 或更高版本

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]
        }
    }
}


extension Collection {
    func distance(to index: Index) -> Int { distance(from: startIndex, to: index) }
}


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
    }
}




Testing

测试

let str = "112312451"

let final = str.pairs.joined(separator: ":")
print(final)      // "11:23:12:45:1"

let final2 = str.inserting(separator: ":", every: 2)
print(final2)      // "11:23:12:45:1\n"

var str2 = "112312451"
str2.insert(separator: ":", every: 2)
print(str2)   // "11:23:12:45:1\n"

var str3 = "112312451"
str3.insert(separator: ":", every: 3)
print(str3)   // "112:312:451\n"

var str4 = "112312451"
str4.insert(separator: ":", every: 4)
print(str4)   // "1123:1245:1\n"

回答by Stéphane de Luca

I'll go for this compact solution (in Swift 4) :

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

let s = "11231245"
let r = String(s.enumerated().map { 
extension String {
    func separate(every stride: Int = 4, with separator: Character = " ") -> String {
        return String(enumerated().map { 
let x = "11231245"
print (x.separate(every:2, with: ":")

$ 11:23:12:45
> 0 &&
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)
% stride == 0 ? [separator, ] : []}.joined()) } }
> 0 &&
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)[
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")
..<min(
let y = String(
    x.characters.enumerate().map() {
        
let testString = "123456789"

let ansTest = testString.enumerated().compactMap({ (
extension String {

    func insertSeparator(_ separatorString: String, atEvery n: Int) -> String {
        guard 0 < n else { return self }
        return self.enumerated().map({String(
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    
.element) + ((
extension String{

func separate(every: Int) -> [String] {
    return stride(from: 0, to: count, by: every).map {
        let ix0 = index(startIndex, offsetBy: 
func separate(every: Int) -> [String] {
    var parts:[String] = [];
    var ix1 = startIndex;
    while ix1 < endIndex {
        let ix0 = ix1;
        var n = 0;
        while ix1 < endIndex && n < every {
            ix1 = index(after: ix1);
            n += 1;
        }
        parts.append(String(self[ix0..<ix1]));
    }
    return parts;
}

"asdf234sdf".separate(every: 2).joined(separator: ":");
); let ix1 = index(after:ix0); if ix1 < endIndex { return String(self[ix0...ix1]); }else{ return String(self[ix0..<endIndex]); } } }
.offset != self.count - 1 &&
extension String {
    func inserted(_ newElement: Character,atEach increment:Int)->String {
        var newStr = self

        for indx in stride(from: increment, to: newStr.count, by: increment).reversed() {
            let index = String.Index(encodedOffset: indx)
            newStr.insert(newElement, at: index)
        }

        return newStr
    }
 }
.offset % n == n - 1) ? "\(separatorString)" : "")}).joined() } mutating func insertedSeparator(_ separatorString: String, atEvery n: Int) { self = insertSeparator(separatorString, atEvery: n) } }
> 0) && (##代码## % 2 == 0) ? ":\()" : "\()" }).joined() ?? "" print(ansTest) // 12:34:56:78:9
.index % 2 == 0 ? [##代码##.element] : [##代码##.element, ":"] }.flatten() )
+ every, Array(self).count)]) }.joined(separator: separator)) } }
% 2 == 0 ? [":", ] : []}.joined())

You can make an extension and parameterize the stride and the separator so that you can use it for every value you want (In my case, I use it to dump 32-bit space-operated hexadecimal data):

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

##代码##

In your case this gives the following results:

在您的情况下,这会产生以下结果:

##代码##

回答by Evgeniy

Its my code in swift 4

它是我在 swift 4 中的代码

##代码##

Outputs 11:23:12:45

输出 11:23:12:45

回答by Joe Maher

Short and simple, add a letor two if you want

简短而简单,let如果需要,可以添加一两个

##代码##

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

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

ais

a

sepa rate mepl ease andt hank you

分开 mepl 轻松和谢谢你

回答by luk2302

My attempt at that code would be:

我对该代码的尝试是:

##代码##

Which outputs

哪些输出

11:23:12:45

11:23:12:45

回答by courteouselk

##代码##

回答by ilyas

A simple One line of code for inserting separater ( Swift 4.2 ):-

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

##代码##

回答by choofie

Swift 4.2.1 - Xcode 10.1

斯威夫特 4.2.1 - Xcode 10.1

##代码##

Usage

用法

##代码##

回答by john07

##代码##

/// or O(1) implementation (without count)

/// 或 O(1) 实现(不计)

##代码##

回答by Steig

A simple String extension that doesn't require the original string to be a multiple of the step size (increment):

一个简单的字符串扩展,不需要原始字符串是步长(增量)的倍数:

##代码##