【问题标题】:How can I extract numbers from string in Swift in a specific way如何以特定方式从 Swift 中的字符串中提取数字
【发布时间】:2020-08-11 13:30:41
【问题描述】:

我正在努力从 Swift 中的字符串中提取数字。我正在执行以下操作:

let expression: String = "abc123aa223bb45"
for (indx, ch) in expression.enumerated() {
    if ch.isLetter { continue }
    else if ch.isNumber {
        var val: Int = 0
        while(indx < expression.count && ch.isNumber){
            val = val * 10 + (ch.asciiValue - 48)
            //how can I proceed and increment both indx and ch ...
        }
        // here I'm going to do smthing with every extracted number
    }
}

有人可以帮我解决我遇到的这个问题吗?

我也使用扩展程序

extension Character {
    var asciiValue: Int {
        get {
            let s = String(self).unicodeScalars
            return Int(s[s.startIndex].value)
        }
    }
}

正如您在发布的代码片段中看到的那样

【问题讨论】:

    标签: swift string loops while-loop numbers


    【解决方案1】:

    我正在尝试编写一个使用大括号和运算符计算表达式的程序:^,+,-,/,*

    但是我遇到了一些问题(我已经用 C++ 和 C# 做过很多次了,但是我不能用 swift 做到这一点。这真的让我很头疼):

    import Foundation
    
    extension Character {
        var asciiValue: Int {
            get {
                let s = String(self).unicodeScalars
                return Int(s[s.startIndex].value)
            }
        }
    }
    
    precedencegroup PowerPrecedence { higherThan: MultiplicationPrecedence }
    infix operator ^^ : PowerPrecedence
    func ^^ (radix: Double, power: Int) -> Double {
        return (pow(Double(radix), Double(power)))
    }
    
    func calc(a: Double, b: Double, o: Character) -> Double {
        switch o {
        case "+":
            return a + b
        case "-":
            return a - b
        case "/":
            return a / b
        case "*":
            return a * b
        case "^":
            return a ^^ Int(b)
        default:
            return 0
        }
    }
    
    func nice(o: Character) -> Int {
        if o == "-" || o == "+" { return 1 }
        if o == "*" || o == "/" { return 2 }
        if o == "^" { return 3 }
        return 2020
    }
    
    func evaluate(expression: String) -> Double {
        var vals = [Double]()
        var ops = [Character]()
    
        for (indx, ch) in expression.enumerated() {
            if ch == " " { continue }
            else if ch == "(" { ops.append(ch) }
            else if ch.isNumber {
                var val: Int = 0
                while(indx < expression.count && ch.isNumber){
    val = val * 10 + ch.asciiValue - 48 // gives strange error
                    //TODO increment indx and ch
                }
                vals.append(Double(val))
            } else if ch == ")" {
                while !ops.isEmpty && ops.last != "(" {
                    let val_2: Double = vals.popLast()!
                    let val_1: Double = vals.popLast()!
                    let op: Character = ops.popLast()!
                    vals.append(calc(a: val_1, b: val_2, o: op))
                }
                if !ops.isEmpty { _ = ops.popLast() } // opening brace
            } else {
                while(!ops.isEmpty && nice(o: ops.last!) >= nice(o: ch)){
                    let val_2: Double = vals.popLast()!
                    let val_1: Double = vals.popLast()!
                    let op: Character = ops.popLast()!
                    vals.append(calc(a: val_1, b: val_2, o: op))
                }
                ops.append(ch);
            }
        }
        while !ops.isEmpty {
            let val_2: Double = vals.popLast()!
            let val_1: Double = vals.popLast()!
            let op: Character = ops.popLast()!
            vals.append(calc(a: val_1, b: val_2, o: op))
        }
        return vals.last!
    }
    
    let exp: String = "2^3+(2+3)"
    print(evaluate(expression: exp))
    

    【讨论】:

      【解决方案2】:

      以下代码 sn-p 将从字符串中提取数字

      let expression: String = "abc123aa223bb45"    
      let stringArray = expression.components(separatedBy: CharacterSet.decimalDigits.inverted)
      for item in stringArray {
          if let number = Int(item) {
              print(number)
          }
      }
      

      您还可以对 Int 进行扩展,使其具有类似的功能

      extension Int {
          static func parse(from string: String) -> Int? {
              return Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined())
          }
      }
      

      可以这样使用

      let expression: String = "abc123aa223bb45"
      if let number = Int.parse(from: expression) {
          print(number)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        相关资源
        最近更新 更多