Swift 如何从字符串中获取整数并将其转换为整数

Swift How to get integer from string and convert it into integer

我需要从字符串中提取数字并将它们放入 Swift 中的新数组中。

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

我试图循环每个字符,但我不知道要比较字符和整数。

// 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) {[=11=] == " "}
for subString in strArray{
  if let int = subString.toInt(){
    ints.append(int)
  }
}

这里我们在任意位置拆分字符串 space 并为长字符串中的每个子字符串创建一个数组。
我们再次检查每个字符串以查看它是否(或可以转换为)整数。

首先,我们拆分字符串以便处理单个项目。然后我们只使用 NSCharacterSet 到 select 数字。

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

使用 中的 "regex helper function":

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([=10=].range)}
}

您可以通过

轻松实现
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let numbersAsStrings = matchesForRegexInText("\d+", str) // [String]
let numbersAsInts = numbersAsStrings.map { [=11=].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([=12=].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, [=13=]) }
    .map { [=13=].toInt()! }
println(numbers) // [3, 7, 10]

感谢所有回答我问题的人。

我正在寻找仅使用 swift 语法的代码块,因为我现在才学习语法..

我得到了 question.Maybe 的答案,这不是一种更容易解决的方法,但它仅使用 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.")
let str = "Hello 1, World 62"
let intString = str.componentsSeparatedByCharactersInSet(
    NSCharacterSet
        .decimalDigitCharacterSet()
        .invertedSet)
    .joinWithSeparator("")

这将为您提供一个包含所有数字的字符串,然后您可以这样做:

let int = Int(intString)

请务必打开它,因为 let int = Int(intString) 是可选的。

改编自@flashadvanced 的, 我发现以下内容对我来说更短更简单。

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

在游乐场试了一下,效果很好

希望对您有所帮助:)

Swift 2.2

  let strArr = str.characters.split{[=10=] == " "}.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)")
                      }
              }

Swift 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
} 

对我来说,将它作为字符串扩展更有意义,这可能是个人喜好问题:

func parseToInt() -> Int? {
    return Int(self.components(separatedBy: CharacterSet.decimalDigits.inverted).joined())
}

所以可以这样使用:

if let number = "0kaksd020dk2kfj2123".parseToInt() { 
// Do something with this number
}