【问题标题】:Swift How to get integer from string and convert it into integerSwift 如何从字符串中获取整数并将其转换为整数
【发布时间】:2015-08-01 07:00:02
【问题描述】:

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

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

我试图循环每个字符,但我不知道在 Characters 和 Int 之间进行比较。

【问题讨论】:

标签: string swift integer character


【解决方案1】:

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

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

所以可以这样使用:

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

【讨论】:

    【解决方案2】:

    首先,我们拆分字符串以便处理单个项目。然后我们使用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)")
        }
    }
    

    斯威夫特 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)")
        }
    }
    

    【讨论】:

    • 这是实现所需内容的更简单、更好的方法。为了简化并在您的应用中看起来易于使用,您不能创建 String 类的扩展并创建名为 extractNumbers 的方法
    • 在 Swift 2 中,拆分不再适用于字符串。见stackoverflow.com/a/30759312/2959462
    【解决方案3】:

    斯威夫特 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
    } 
    

    【讨论】:

      【解决方案4】:

      斯威夫特 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)")
                            }
                    }
      

      【讨论】:

        【解决方案5】:

        改编自@flashadvanced 的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)
        

        在操场上试过,效果很好

        希望对你有帮助:)

        【讨论】:

        • 这将返回字符串类型的小数数组。干得好。
        • 让组件 = str.components(separatedBy: NSCharacterSet.decimalDigits.inverted) -> Swift 5
        【解决方案6】:
        let str = "Hello 1, World 62"
        let intString = str.componentsSeparatedByCharactersInSet(
            NSCharacterSet
                .decimalDigitCharacterSet()
                .invertedSet)
            .joinWithSeparator("")
        

        这会给你一个包含所有数字的字符串,然后你可以这样做:

        let int = Int(intString)
        

        请确保您打开它,因为 let int = Int(intString) 是可选的。

        【讨论】:

          【解决方案7】:

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

          我一直在寻找只使用 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.")
          

          【讨论】:

            【解决方案8】:

            使用Swift extract regex matches 中的“正则表达式辅助函数”:

            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]
            

            【讨论】:

            • 感谢您的回答,但我正在寻找不使用功能。但非常感谢。
            【解决方案9】:
            // 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)
              }
            }
            

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

            【讨论】:

            • 非常感谢!但它可以识别 10,比如 1 和 0。我怎样才能得到数字 10?
            • 整数和其他数字之间总是有空格吗?
            • 是否可以检查,如果一个数字再次变成一个数字(没有空格),它是否识别为一个数字??
            • 是的,但它确实不会比@flashadvanced 答案更容易或更漂亮(你可能应该将他的答案标记为“the”答案)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-22
            • 1970-01-01
            • 2021-10-13
            • 2015-12-28
            相关资源
            最近更新 更多