swift - स्ट्रिंग से गैर-अंकों को फ़िल्टर करें




string numbers (8)

विवरण

xCode 8.2.1, स्विफ्ट 3

विचार

स्ट्रिंग से चार सेट निकालें

स्ट्रिंग को स्विफ्ट में फ़िल्टर करें

import Foundation

extension String {

    private func removeCharacters(unicodeScalarsFilter: (UnicodeScalar) -> Bool) -> String {
        let filtredUnicodeScalars = unicodeScalars.filter{unicodeScalarsFilter($0)}
        return String(String.UnicodeScalarView(filtredUnicodeScalars))
    }

    private func removeCharacters(from charSets: [CharacterSet], unicodeScalarsFilter: (CharacterSet, UnicodeScalar) -> Bool) -> String {
        return removeCharacters{ unicodeScalar in
            for charSet in charSets {
                let result = unicodeScalarsFilter(charSet, unicodeScalar)
                if result {
                    return true
                }
            }
            return false
        }
    }

    func removeCharacters(charSets: [CharacterSet]) -> String {
        return removeCharacters(from: charSets) { charSet, unicodeScalar in
            !charSet.contains(unicodeScalar)
        }
    }

    func removeCharacters(charSet: CharacterSet) -> String {
        return removeCharacters(charSets: [charSet])
    }

    func onlyCharacters(charSets: [CharacterSet]) -> String {
        return removeCharacters(from: charSets) { charSet, unicodeScalar in
            charSet.contains(unicodeScalar)
        }
    }

    func onlyCharacters(charSet: CharacterSet) -> String {
        return onlyCharacters(charSets: [charSet])
    }
}

प्रयोग

let string = "23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b`kefl;nwdl qsa`WKFSA,.E"
print("original string:                     \(string)")
print("only .decimalDigits:                 \(string.onlyCharacters(charSet: .decimalDigits))")
print("only [.decimalDigits, .symbols]:     \(string.onlyCharacters(charSets: [.decimalDigits, .symbols]))")
print("remove .decimalDigits:               \(string.removeCharacters(charSet: .decimalDigits))")
print("remove [.decimalDigits, .symbols]:   \(string.removeCharacters(charSets: [.decimalDigits, .symbols]))")

परिणाम

ऊपर कोड के लिए एक्सटेंशन

निर्माण त्वरित फ़िल्टर के लिए एक छोटा सा विचार। यह ऊपर लिखे कोड का विस्तार है

कोड एक्सटेंशन

extension String {

    var onlyDigits: String {
        return onlyCharacters(charSets: [.decimalDigits])
    }

    var onlyLetters: String {
        return onlyCharacters(charSets: [.letters])
    }
}

कोड एक्सटेंशन का उपयोग

let string = "23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b`kefl;nwdl qsa`WKFSA,.E"
print("original string: \(string)")
print(".onlyDigits:     \(string.onlyDigits)")
print(".onlyLetters: \(string.onlyLetters)")

कोड विस्तार परिणाम

केवल स्विफ्ट कोड I कैंटन फिगर का उपयोग करके "(555) 555-5555" कैसे लें और केवल संख्यात्मक मान लौटाएं और "5555555555" प्राप्त करें। मुझे सभी कोष्ठक, श्वेत स्थान, और डैश हटाने की आवश्यकता है। एकमात्र उदाहरण जो मुझे मिल सकता है, उद्देश्य-सी में हैं और वे सभी .trim () पद्धति का उपयोग करते हैं। ऐसा प्रतीत होता है कि स्विफ्ट में यह विधि नहीं है, लेकिन इसमें .stringByTrimmingCharacters विधि है, लेकिन यह केवल डेटा से पहले और बाद में सफेद रिक्त स्थान को ट्रिम करने के लिए लगता है।


आप NSCharacterSet का उपयोग करना चाहते हैं:

स्विफ्ट और ओबज-सी कार्यान्वयन के लिए इस NSHipster लिंक की जाँच करें: http://nshipster.com/nscharacterset/

इसी तरह का उदाहरण:

var string = "  Lorem    ipsum dolar   sit  amet. "

let components = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).filter({!isEmpty($0)})

string = join(" ", components)

देखें: विराम चिह्न

विवरण:

एक ऐसा चरित्र सेट करता है जिसमें पात्रों को पंचर की श्रेणी में रखा जाता है। अनौपचारिक रूप से, यह सेट सभी गैर-व्हाट्सएप पात्रों का सेट है, जिसका उपयोग लिपियों में भाषाई इकाइयों को अलग करने के लिए किया जाता है, जैसे कि अवधि, डैश, कोष्ठक, और इसी तरह।

एक शानदार सुझाव देता है: NSCharacterSet.decimalDigitCharacterSet().invertedSet NSCharacterSet.decimalDigitCharacterSet().invertedSet


बिल्कुल जवाब नहीं दिया लेकिन यह एक नंबर की तरह लग रहा है। URL का उपयोग करने के लिए मैंने URL का निर्माण किया क्योंकि यह कोष्ठक से बाहर निकलता है और स्वचालित रूप से डैश होता है:

var telUrl: URL? {
            var component = URLComponents()
            component.scheme = "tel"
            component.path = "+49 (123) 1234 - 56789"
            return component.url
        }

फिर

UIApplication.shared.open(telUrl, options: [:], completionHandler: nil)

+49 123 123456789 पर कॉल करें


मुझे नियमित अभिव्यक्ति पसंद है:

var s = "(555) 555-5555"
s = s.stringByReplacingOccurrencesOfString(
    "\\D", withString: "", options: .RegularExpressionSearch, 
    range: s.startIndex..<s.endIndex)

मेरे पास एक समान मुद्दा था लेकिन मुझे दशमलव बिंदुओं को बनाए रखने की आवश्यकता थी। मैंने इसका शीर्ष उत्तर दिया:

extension String {

    /// Returns a string with all non-numeric characters removed
    public var numericString: String {
        let characterSet = CharacterSet(charactersIn: "01234567890.").inverted
        return components(separatedBy: characterSet)
            .joined()
    }
}

यहाँ @Tapani स्विफ्ट 3.2 समाधान है

let phno = contact.phoneNumbers[0].phoneNumber
let strarr = phno.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
let newString = NSArray(array: strarr).componentsJoined(by: "")
print(newString)

स्विफ्ट 3 और 4:

extension String {
    var digits: String {
        return components(separatedBy: CharacterSet.decimalDigits.inverted)
            .joined()
    }
}

स्विफ्ट 4 में समाधान अधिक अच्छा है:

import Foundation

let sourceText = "+5 (555) 555-5555"

let allowedCharset = CharacterSet
    .decimalDigits
    .union(CharacterSet(charactersIn: "+"))

let filteredText = String(sourceText.unicodeScalars.filter(allowedCharset.contains))

print(filteredText) // +55555555555






numbers