Swift - 从String中提取Double值

时间:2015-04-04 19:05:38

标签: string swift double

如何检查我的字符串是否仅包含[0-9].
我希望从我的字符串中删除所有其他符号。 如果用户输入任何字符串

var anyString:String = “3f00b6r.beAwes0me4me”

我想从中提取所有数字(如果存在,则包括一个.)并删除所有其他字符。

var myDouble:Double = 3006.04

有谁知道如何做到这一点?

1 个答案:

答案 0 :(得分:5)

您可以使用NSRegularExpression,如下所示:

// First set up error for checking
var error:NSError?

// Create regular expression pattern to search for numbers one digit in length or longer
let regexString = NSRegularExpression(pattern: "[0-9]{1,}.[0-9]{1,}|[0-9]{1,}", options: nil, error: &error)
// example string
let string = "find the number 10.19"
// get the string length
let strLength = count(string)
// To return the result first of all obtain the range of the first match if there is one, if let used here because NSRegularExpression returns an optional (we could of checked earlier, but I didn't)
if let rangeOfFirstMatch = regexString?.rangeOfFirstMatchInString(string, options: nil, range: NSMakeRange(0, strLength))
{
    // if a range has been found that isn't equal to NSNotFound then build a range for the found string
if !NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0)) {
advance(string.startIndex, rangeOfFirstMatch.length)
    let r =  Range(start: advance(string.startIndex, rangeOfFirstMatch.location), end: advance(string.startIndex, rangeOfFirstMatch.location+rangeOfFirstMatch.length))
// return the value
    let substringForFirstMatch = string.substringWithRange(r)
    println("Here's your match: \(substringForFirstMatch)")
    }
}

还有String.stringByTrimmingCharactersInSet()更清洁,更快,但不是那么多才多艺。例如,如果你这样做,也会返回上面的字符串:

let set = NSMutableCharacterSet.alphanumericCharacterSet()
set.addCharactersInString(" ")
set.removeCharactersInString("0123456789.")

string.stringByTrimmingCharactersInSet(set)

但是如果字符串更改为“查找数字?? ... 10.19 ....”那么stringByTrimmingCharactersInSet()会让你失望并返回"??...10.19....",而正则表达式版本会保持不变。 / p>

为了简单起见,可以像这样编写String扩展,以便在Double或Int类型的字符串中返回多个数字:

extension String {

    func stringsMatchingRegularExpression(expression exp:String, error err:NSErrorPointer) -> [String]? {
        var strArray:[String]?
        var rangeArray:[NSRange]?
        let strLength = count(self)
        var startOfRange = 0
        if let regexString = NSRegularExpression(pattern: exp, options: nil, error: err) {

            while startOfRange <= strLength {
                let rangeOfMatch = regexString.rangeOfFirstMatchInString(self, options: nil, range: NSMakeRange(startOfRange, strLength-startOfRange))
                if let rArray = rangeArray {
                    rangeArray = rArray + [rangeOfMatch]
                }
                else {
                    rangeArray = [rangeOfMatch]
                }
                startOfRange = rangeOfMatch.location+rangeOfMatch.length


            }
            if let ranArr = rangeArray {
                for r in ranArr {

                    if !NSEqualRanges(r, NSMakeRange(NSNotFound, 0)) {
                        advance(self.startIndex, r.length)
                        let r =  Range(start: advance(self.startIndex, r.location), end: advance(string.startIndex, r.location+r.length))
                        // return the value
                        let substringForMatch = self.substringWithRange(r)
                        if let sArray = strArray {
                            strArray = sArray + [substringForMatch]
                        }
                        else {
                            strArray = [substringForMatch]
                        }

                    }

                }
            }
        }
        return strArray
    }
}
let myString = "one number is 7.5, another is 20"
let subStringArray = myString.stringsMatchingRegularExpression(expression: "[0-9]{1,}.[0-9]{1,}|[0-9]{1,}", error: nil)
subStringArray?[0] // 7.5
subStringArray?[1] // 20

Swift 2.0 Extension for Extension

extension String {

    func stringsMatchingRegularExpression(expression exp:String) -> [String]? {
        var strArray:[String]?
        var rangeArray:[NSRange]?
        let strLength = self.characters.count
        var startOfRange = 0
        do {
         let regexString = try NSRegularExpression(pattern: exp, options: [])
            while startOfRange <= strLength {
                let rangeOfMatch = regexString.rangeOfFirstMatchInString(self, options: [], range: NSMakeRange(startOfRange, strLength-startOfRange))
                if let rArray = rangeArray {
                    rangeArray = rArray + [rangeOfMatch]
                }
                else {
                    rangeArray = [rangeOfMatch]
                }
                startOfRange = rangeOfMatch.location+rangeOfMatch.length


            }
            if let ranArr = rangeArray {
                for r in ranArr {

                    if !NSEqualRanges(r, NSMakeRange(NSNotFound, 0)) {
                        self.startIndex.advancedBy(r.length)
                        let r =  Range(start: self.startIndex.advancedBy(r.location), end: self.startIndex.advancedBy(r.location + r.length))

                        // return the value
                        let substringForMatch = self.substringWithRange(r)
                        if let sArray = strArray {
                            strArray = sArray + [substringForMatch]
                        }
                        else {
                            strArray = [substringForMatch]
                        }

                    }

                }
            }
        }        catch {
        }




        return strArray
    }
}
let myString = "one number is 7.5, another is 20"
let subStringArray = myString.stringsMatchingRegularExpression(expression: "[-+]?\\d+.?\\d+")
subStringArray?[0] // 7.5
subStringArray?[1] // 20

Swift 3.0 Extension for Extension

extension String {

    func stringsMatchingRegularExpression(expression exp:String) -> [String]? {
        var strArray:[String]?
        var rangeArray:[NSRange]?
        let strLength = self.characters.count
        var startOfRange = 0
        do {
            let regexString = try NSRegularExpression(pattern: exp, options: [])
            while startOfRange <= strLength {
                let rangeOfMatch = regexString.rangeOfFirstMatch(in: self, options: [], range: NSMakeRange(startOfRange, strLength-startOfRange))
                if let rArray = rangeArray {
                    rangeArray = rArray + [rangeOfMatch]
                }
                else {
                    rangeArray = [rangeOfMatch]
                }
                startOfRange = rangeOfMatch.location+rangeOfMatch.length


            }
            if let ranArr = rangeArray {
                for r in ranArr {

                    if !NSEqualRanges(r, NSMakeRange(NSNotFound, 0)) {
                        self.index(startIndex, offsetBy: r.length)

                        let r =  self.index(startIndex, offsetBy:r.location)..<self.index(startIndex, offsetBy:r.location + r.length)

                        // return the value
                        let substringForMatch = self.substring(with: r)
                        if let sArray = strArray {
                            strArray = sArray + [substringForMatch]
                        }
                        else {
                            strArray = [substringForMatch]
                        }

                    }

                }
            }
        }
        catch {
        // catch errors here
        }

        return strArray
    }
}
let myString = "one number is 7.5, another is 20"
let subStringArray = myString.stringsMatchingRegularExpression(expression: "[-+]?\\d+.?\\d+")
subStringArray?[0] // 7.5
subStringArray?[1] // 20