How to add a separator to a string for every N characters in swift?

I have a string that contains binary digits. How to divide it into pairs of numbers?

Assume the line:

let x = "11231245" 

I want to add a delimiter such as ":" (ie, a colon) after every two characters.

I would like the result to be:

 "11:23:12:45" 

How can I do this in Swift?

+23
string ios swift character
Dec 24 '15 at
source share
10 answers

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



 extension StringProtocol where Self: RangeReplaceableCollection { mutating func insert(separator: Self, every n: Int) { for index in indices.reversed() where index != startIndex && distance(from: startIndex, to: index) % n == 0 { insert(contentsOf: separator, at: index) } } func inserting(separator: Self, 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" 
+50
Dec 24 '15 at 15:02
source share

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

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

You can make an extension and parameterize the step and delimiter so that you can use it for every value you want (in my case, I use it to output 32-bit hex data with spaces):

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

In your case, this gives the following results:

 let x = "11231245" print (x.separate(every:2, with: ":") $ 11:23:12:45 
+16
Dec 20 '17 at 13:14
source share

Short and simple, add let or two if you want

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

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

a is

sepa rate mepl ease andt hank you

+10
Nov 30 '17 at 5:12
source share

My attempt at this code:

 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") 

What are the exits

11: 23: 12: 45

+7
Dec 24 '15 at 15:13
source share
 let y = String( x.characters.enumerate().map() { $0.index % 2 == 0 ? [$0.element] : [$0.element, ":"] }.flatten() ) 
+7
Dec 24 '15 at 16:23
source share

Its my code in fast 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) 

Outputs 11: 23: 12: 45

+6
Nov 11 '17 at 18:29
source share

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



using

 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 
+1
Apr 09 '19 at 12:56
source share

Simple line of code to insert a separator (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 
+1
Aug 22 '19 at 8:42
source share
 extension String{ func separate(every: Int) -> [String] { return stride(from: 0, to: count, by: every).map { let ix0 = index(startIndex, offsetBy: $0); let ix1 = index(after:ix0); if ix1 < endIndex { return String(self[ix0...ix1]); }else{ return String(self[ix0..<endIndex]); } } } 

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

 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: ":"); 
0
May 14 '18 at 23:07
source share

A simple String extension that does not require the source string to be a multiple of the step size (increment):

 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 } } 
0
Aug 7 '18 at 13:59 on
source share



All Articles