Как я могу извлечь числа из строки в Swift указанным c способом - PullRequest
3 голосов
/ 27 апреля 2020

Я пытаюсь извлечь числа из строки в 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)
        }
    }
}

как вы можете видеть в размещенном фрагменте кода

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Я пытаюсь написать программу, которая оценивает выражение с помощью фигурных скобок и операторов: ^, +, -, /, *

Но у меня возникают некоторые проблемы (я делал это много раз с 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))
1 голос
/ 28 апреля 2020

Следующий фрагмент кода будет извлекать числа из строки

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)
}
...