Reputation: 4128
I have few problems. I try to format telephone number in swift. Now i have only numbers.
var number = "(123) 456-789"
let clean = "".join(number.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))
The question is. How to check indexes from 0...3 in this string. If there will be something like "0044" or in indexes 0...1 "44" then remove it.
Upvotes: 0
Views: 2785
Reputation: 8883
let number = "0044 123 456-7890"
let numberArray = map(number) { String($0) }
let numbersOnly = numberArray.filter { $0.toInt() != nil }
let numbers = "".join(numbersOnly.reverse()[0...9].reverse())
println(numbers) // Prints "1234567890"
This is just to give you a general example of how it can be done. I really don't like using fixed numbers for indexes. This should be safe if your phone numbers always have at least 10 numbers.
Updated the answer for Swift 4.
It's safe and crash friendly now!
let number = "0044 123 456-7890"
let numberArray = number.map { String ($0) }
var numbersOnly = numberArray.filter { Int($0) != nil }
let remove = numbersOnly.count > 3 ? numbersOnly[...3].joined() == "0044" : false
let result = numbersOnly[(remove ? 4 : 0)...]
print(result) // 1234567890
Upvotes: 2
Reputation: 1458
Thanks. I used the other answers and put together an extension for it (I included some range stuff from other answers on here)
extension String {
subscript (i: Int) -> Character {
return self[self.startIndex.advancedBy(i)]
}
subscript (i: Int) -> String {
return String(self[i] as Character)
}
subscript (r: Range<Int>) -> String {
let start = startIndex.advancedBy(r.startIndex)
let end = start.advancedBy(r.endIndex - r.startIndex)
return self[Range(start ..< end)]
}
func phoneFormat() -> String {
let numbers = self.stringByReplacingOccurrencesOfString("[^\\d]", withString: "", options: .RegularExpressionSearch)
let tenchars = numbers.characters.suffix(10)
if tenchars.count != 10 {
return self
}
let last10 = String(tenchars)
return last10[0...2] + "-" + last10[3...5] + "-" + last10[6...9]
}
}
then you just do:
"1 (208) 754-2323".phoneFormat()
and it comes out clean: "208-754-2323"
Upvotes: 1
Reputation: 11435
Try this:
var number = "(123) 456-789"
let clean:NSString = number.stringByReplacingOccurrencesOfString(
"[(][1-9]+[)] |[-]",
Upvotes: 0