2016-02-05 14 views
-3

我有一個字符串904 522 9773,本質上是一個電話號碼,我試圖擺脫空格。我打電話stringByReplacingOccurrencesOfString(" ", withString: ""),但" "字符沒有被替換。有什麼理由呢?stringByReplacingOccurrencesOfString(「」,withString:「」)不起作用

這裏是我的代碼:

 override func viewDidLoad() { 
      super.viewDidLoad() 

      func findContacts() -> [CNContact] { 

       let store = CNContactStore() 

       let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), 
        CNContactImageDataKey, 
        CNContactPhoneNumbersKey] 

       let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) 


       var contacts = [CNContact]() 

       do { 
        try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in 

         if contact.phoneNumbers.count != 0 { 

          for phoneNumber:CNLabeledValue in contact.phoneNumbers { 

           let a = phoneNumber.value as! CNPhoneNumber 

           var number: String = "\(a.stringValue)" 

           if number.characters.first == "1" { 

            let start = number.startIndex 

            number.removeAtIndex(start) 

           } 

           // number = +1 (904) 522-9773 

           let b = number.stringByReplacingOccurrencesOfString("+1", withString: "") // (904) 522-9773 
           let c = b.stringByReplacingOccurrencesOfString("(", withString: "") // 904) 522-9773 
           let d = c.stringByReplacingOccurrencesOfString(")", withString: "") // 904 522-9773 
           let e = d.stringByReplacingOccurrencesOfString("-", withString: "") // 904 522 9773 
           let f = e.stringByReplacingOccurrencesOfString(" ", withString: "") // SHOULD BE 9045229773 

           print(f) // BUT is printing 904 5229773 
          } 

         } 


        }) 
       } 
       catch let error as NSError { 
        print(error.localizedDescription) 
       } 

       return contacts 


      } 
+0

'stringByReplacingOccurrencesOfString'返回一個新的字符串。它不會改變當前的一個 –

+0

是的,我知道。應該澄清。查看已更新。 – chicobermuda

+0

'spacelessNum'不包含我的空間 –

回答

3
let origin = "904 522\u{00a0}9773" // \u{00a0} is a no-break space 
let result = String(origin.characters.filter { !" \u{00a0}".characters.contains($0) }) 

print(origin) // "904 522 9773" 
print(result) // "9045229773" 

這消除了通常的空白和不間斷的空間。

編輯:

let spaces = NSCharacterSet.whitespaceCharacterSet() 
let result = origin.utf16.filter { !spaces.characterIsMember($0) }.map { Character(UnicodeScalar($0)) }) 

這是類似(還刪除選項卡),但時間長一點。如果您更喜歡單行解決方案,但也希望刪除選項卡(或任何其他選項),則可以將其簡單地添加到閉包中的字符串中。

我只是簡單地看一下你的代碼,你可以刪除(,),-以及一行中的空格。只是這些字符添加到封閉:

let result = String(number.characters.filter { !" \u{00a0}()-".characters.contains($0) }) 

這可能與+1進行爲好,但需要更多的工作。

編輯:

另一種方法是過濾掉所有號碼的開出的字符串。這是,如果你的字符串包含很多其它字符要過濾掉更多的有用:

let filter = NSCharacterSet.alphanumericCharacterSet() 
let result = String(origin.utf16.filter { filter.characterIsMember($0) }.map { Character(UnicodeScalar($0)) }) 
+0

謝謝!你介意解釋爲什麼這個工作,但'stringByReplacingOccurrencesOfString(「」,withString:「」)'不? – chicobermuda

+0

我能想到的一個原因是Duncan C說,在你的字符串中可能會有一個「非破壞性空間」,其中「!」\ u {00a0}。characters.contains($ 0)'負責處理。你可以通過刪除'\ u {00a0}'來進行測試。 – Eendje

+0

更新了一下這個問題。 – Eendje

-3
let myString = "904 522 9773" 
let result = myString.stringByReplacingOccurrencesOfString(" ", withString: "") 
print(result = \(result)) 

古德勒克!

+2

OP指定了swift標記,但是您發佈了objective-c代碼。您應該編輯並提供快速語言的代碼。 –

1

如果你試圖處理電話號碼,使用一個像樣的圖書館,像libPhoneNumber。電話號碼很複雜。例如,我自己寫的最好的代碼可能會被意大利數字打破。另一方面,你的代碼只有在美國和加拿大工作的機會。許多不滿意的用戶。

+0

感謝您的建議。那是在Swift嗎?你介意提供一個鏈接嗎? – chicobermuda

相關問題