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
How add separator to string at every N characters in swift?
提问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 let
or two if you want
简短而简单,let
如果需要,可以添加一两个
let a = "separatemepleaseandthankyou".separate(every: 4, with: " ")
let a = "separatemepleaseandthankyou".separate(every: 4, with: " ")
a
is
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):
一个简单的字符串扩展,不需要原始字符串是步长(增量)的倍数:
##代码##