it-roy-ru.com

Swift Как получить целое число из строки и преобразовать его в целое число

Мне нужно извлечь числа из строки и поместить их в новый массив в Swift.

var str = "I have to buy 3 apples, 7 bananas, 10eggs"

Я пытался зациклить каждого персонажа, и я понятия не имею, чтобы сравнить между персонажами и Int.

11
alphonse

Сначала мы разбиваем строку, чтобы мы могли обрабатывать отдельные элементы. Затем мы используем NSCharacterSet, чтобы выбрать только цифры. 

import Foundation

let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let strArr = str.split(separator: " ")

for item in strArr {
    let part = item.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()

    if let intVal = Int(part) {
        print("this is a number -> \(intVal)")
    }
}

Swift 4 :

let string = "I have to buy 3 apples, 7 bananas, 10eggs"
let stringArray = string.components(separatedBy: CharacterSet.decimalDigits.inverted)
for item in stringArray {
    if let number = Int(item) {
        print("number: \(number)")
    }
}
16
Vasil Garov

Свифт 3/4

let string = "0kaksd020dk2kfj2123"
if let number = Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) {
    // Do something with this number
}

Вы также можете сделать расширение как:

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

И затем позже используйте это как:

if let number = Int.parse(from: "0kaksd020dk2kfj2123") { 
    // Do something with this number
} 
26
George Maisuradze
let str = "Hello 1, World 62"
let intString = str.componentsSeparatedByCharactersInSet(
    NSCharacterSet
        .decimalDigitCharacterSet()
        .invertedSet)
    .joinWithSeparator("")

Это даст вам строку со всем числом, тогда вы можете просто сделать это:

let int = Int(intString)

Просто убедитесь, что вы развернули его, так как let int = Int(intString) является необязательным.

10
Husein Kareem

Используя «вспомогательную функцию регулярного выражения» из Swift Extract Regex Matchs :

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    let regex = NSRegularExpression(pattern: regex,
        options: nil, error: nil)!
    let nsString = text as NSString
    let results = regex.matchesInString(text,
        options: nil, range: NSMakeRange(0, nsString.length))
        as! [NSTextCheckingResult]
    return map(results) { nsString.substringWithRange($0.range)}
}

вы можете легко достичь этого с

let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let numbersAsStrings = matchesForRegexInText("\\d+", str) // [String]
let numbersAsInts = numbersAsStrings.map { $0.toInt()! }  // [Int]

println(numbersAsInts) // [3, 7, 10]

Шаблон "\d+" соответствует одной или нескольким десятичным цифрам.


Конечно, то же самое можно сделать без использования вспомогательной функции , Если вы предпочитаете это по любой причине:

let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let regex = NSRegularExpression(pattern: "\\d+", options: nil, error: nil)!
let nsString = str as NSString
let results = regex.matchesInString(str, options: nil, range: NSMakeRange(0, nsString.length))
    as! [NSTextCheckingResult]
let numbers = map(results) { nsString.substringWithRange($0.range).toInt()! }
println(numbers) // [3, 7, 10]

Альтернативное решение без регулярных выражений:

let str = "I have to buy 3 apples, 7 bananas, 10eggs"

let digits = "0123456789"
let numbers = split(str, allowEmptySlices: false) { !contains(digits, $0) }
    .map { $0.toInt()! }
println(numbers) // [3, 7, 10]
6
Martin R

Swift 2.2

  let strArr = str.characters.split{$0 == " "}.map(String.init)

        for item in strArr {
           let components = item.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)

                let part = components.joinWithSeparator("")

                    if let intVal = Int(part) {
                        print("this is a number -> \(intVal)")
                      }
              }
2
Alessandro Mattiuzzi
// This will only work with single digit numbers. Works with “10eggs” (no space between number and Word
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
var ints: [Int] = []
for char:Character in str {
  if let int = "\(char)".toInt(){
    ints.append(int)
  }
}

Хитрость в том, что вы можете проверить, является ли строка целым числом (но вы не можете проверить, является ли символ) . Зацикливая каждый символ строки, используйте интерполяцию строки, чтобы создать строку из символа и проверьте, чтобы эта строка была приведена как целое число.
Если это возможно, добавьте его в массив.

// This will work with multi digit numbers. Does NOT work with “10 eggs” (has to have a space between number and Word)
var str = "I have to buy 3 apples, 7 bananas, 10 eggs"
var ints: [Int] = []
var strArray = split(str) {$0 == " "}
for subString in strArray{
  if let int = subString.toInt(){
    ints.append(int)
  }
}

Здесь мы разбиваем строку в любом месте и создаем массив каждой подстроки в длинной строке.
Мы снова проверяем каждую строку, чтобы увидеть, является ли она (или может быть приведена как) целым числом.

1
milo526

Адаптируясь из @ flashadvanced's answer , Я обнаружил, что следующее для меня короче и проще.

let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let component = str.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let list = component.filter({ $0 != "" }) // filter out all the empty strings in the component
print(list)

Попробовал в игровой площадке, и это работает

Надеюсь, поможет :)

1
steve0hh

Спасибо всем, кто ответил на мой вопрос.

Я искал блок кода, который использует только грамматику Swift, потому что я изучаю грамматику только сейчас ..

Я получил ответ на мой вопрос. Возможно, это не простой способ решить, но он использует только язык Swift.

var article = "I have to buy 3 apples, 7 bananas, 10 eggs"
var charArray = Array(article)

var unitValue = 0
var total = 0
for char in charArray.reverse() {

    if let number = "\(char)".toInt() {
        if unitValue==0 {
            unitValue = 1
        }
        else {
            unitValue *= 10
        }
        total += number*unitValue
    }
    else {
        unitValue = 0
    }
}
println("I bought \(total) apples.")
0
alphonse