【问题标题】:Converting String to Int with Swift使用 Swift 将 String 转换为 Int
【发布时间】:2014-07-29 16:33:47
【问题描述】:

该应用程序基本上通过输入初始和最终速度和时间来计算加速度,然后使用公式计算加速度。但是,由于文本框中的值是字符串,我无法将它们转换为整数。

@IBOutlet var txtBox1 : UITextField
@IBOutlet var txtBox2 : UITextField
@IBOutlet var txtBox3 : UITextField
@IBOutlet var lblAnswer : UILabel


@IBAction func btn1(sender : AnyObject) {

    let answer1 = "The acceleration is"
    var answer2 = txtBox1
    var answer3 = txtBox2
    var answer4 = txtBox3

【问题讨论】:

  • 没试过,但也许你可以转换像var answer1 = Int(txtBox1.text)这样的值
  • 如果您的字符串假设为“23.0”,那么如果您将其转换为 Int("23.0") 它将返回 nil,对于这种情况,您首先需要转换为 Double/Float,然后再次转换到国际。

标签: ios swift cocoa-touch integer uitextfield


【解决方案1】:

斯威夫特 4、斯威夫特 5

从某物转换为某物数据类型有不同的情况,这取决于输入。

如果输入的数据类型是Any,我们必须在转换为实际数据类型之前使用as,然后再转换为我们想要的数据类型。例如:

func justGetDummyString() -> Any {
  return "2000"
}
let dummyString: String = (justGetDummyString() as? String) ?? "" // output = "2000"
let dummyInt: Int = Int(dummyString) ?? 0 // output = 2000

【讨论】:

    【解决方案2】:

    Swift 4.2Xcode 10.1

    let string = "789"
    if let intValue = Int(string) {
        print(intValue)
    }
    

    let integerValue = 789
    let stringValue = String(integerValue)
    

    let stringValue = "\(integerValue)"
    print(stringValue)
    

    【讨论】:

    • 关于:Int(字符串)!如果字符串为零,则 Int? optional 将为 nil,然后解开 nil optional 将导致崩溃
    • @jcpennypincher,你能更新答案吗?或发布新答案,它可以对其他人有所帮助。谢谢。
    【解决方案3】:

    Swift 2.0+ 的更新答案

    toInt() 方法会报错,因为它在 Swift 2.x 中已从 String 中删除。相反,Int 类型现在有一个接受 String 的初始化程序:

    let a: Int? = Int(firstTextField.text)
    let b: Int? = Int(secondTextField.text)
    

    【讨论】:

    • 我能问一下为什么我在省略'时会出错?'字符?为什么我需要将“a”声明为可选?
    • @ManosSerifios 这个讨论可能会有所帮助:stackoverflow.com/questions/32621022/…
    • 并不真正相关,但构造函数方法对于 Int to Strings 始终是首选且更具可读性。 "\(someInt)" 不好String(someInt) 更容易阅读
    • 我正在打印Int(firstText.text)!,然后我仍然看到可选的。为什么?我没有拆开包装吗?
    • 当字符串为nil时会崩溃。当字符串来自这种情况下的 UI 元素时,可能不会发生。但防止崩溃的一种方法是为字符串添加一个默认值:let a:Int? = Int(firstText.text ?? "")
    【解决方案4】:

    编辑/更新:Xcode 11.4 • Swift 5.2

    请通过代码查看cmets


    IntegerField.swift 文件内容:

    import UIKit
    
    class IntegerField: UITextField {
    
        // returns the textfield contents, removes non digit characters and converts the result to an integer value
        var value: Int { string.digits.integer ?? 0 }
    
        var maxValue: Int = 999_999_999
        private var lastValue: Int = 0
    
        override func willMove(toSuperview newSuperview: UIView?) {
            // adds a target to the textfield to monitor when the text changes
            addTarget(self, action: #selector(editingChanged), for: .editingChanged)
            // sets the keyboard type to digits only
            keyboardType = .numberPad
            // set the text alignment to right
            textAlignment = .right
            // sends an editingChanged action to force the textfield to be updated
            sendActions(for: .editingChanged)
        }
        // deletes the last digit of the text field
        override func deleteBackward() {
            // note that the field text property default value is an empty string so force unwrap its value is safe
            // note also that collection remove at requires a non empty collection which is true as well in this case so no need to check if the collection is not empty.
            text!.remove(at: text!.index(before: text!.endIndex))
            // sends an editingChanged action to force the textfield to be updated
            sendActions(for: .editingChanged)
        }
        @objc func editingChanged() {
            guard value <= maxValue else {
                text = Formatter.decimal.string(for: lastValue)
                return
            }
            // This will format the textfield respecting the user device locale and settings
            text = Formatter.decimal.string(for: value)
            print("Value:", value)
            lastValue = value
        }
    }
    

    您还需要将这些扩展添加到您的项目中:


    扩展 UITextField.swift 文件内容:

    import UIKit
    extension UITextField {
        var string: String { text ?? "" }
    }
    

    Extensions Formatter.swift 文件内容:

    import Foundation
    extension Formatter {
        static let decimal = NumberFormatter(numberStyle: .decimal)
    }
    

    Extensions NumberFormatter.swift文件内容:

    import Foundation
    extension NumberFormatter {
        convenience init(numberStyle: Style) {
            self.init()
            self.numberStyle = numberStyle
        }
    }
    

    Extensions StringProtocol.swift 文件内容:

    extension StringProtocol where Self: RangeReplaceableCollection {
        var digits: Self { filter(\.isWholeNumber) }
        var integer: Int? { Int(self) }
    }
    

    Sample project

    【讨论】:

      【解决方案5】:

      您可以使用NSNumberFormatter().numberFromString(yourNumberString)。这很棒,因为它返回一个可选项,然后您可以使用 if let 进行测试以确定转换是否成功。 例如。

      var myString = "\(10)"
      if let myNumber = NSNumberFormatter().numberFromString(myString) {
          var myInt = myNumber.integerValue
          // do what you need to do with myInt
      } else {
          // what ever error code you need to write
      }
      

      斯威夫特 5

      var myString = "\(10)"
      if let myNumber = NumberFormatter().number(from: myString) {
          var myInt = myNumber.intValue
          // do what you need to do with myInt
        } else {
          // what ever error code you need to write
        }
      

      【讨论】:

      • 我只是将其更改为“myNumber.integerValue”,因为 Xcode 7 不会使用“intValue”构建。后者是 Int32 值
      【解决方案6】:

      Swift5 float 或 int 字符串转 int:

      extension String {
          func convertStringToInt() -> Int {
              return Int(Double(self) ?? 0.0)
          }
      }
      
      let doubleStr = "4.2"
      // print 4
      print(doubleStr.convertStringToInt())
      
      let intStr = "4"
      // print 4
      print(intStr.convertStringToInt())
      

      【讨论】:

        【解决方案7】:

        Swift 5.0 及更高版本

        工作

        如果您要拆分 String ,它会创建两个 substrings 而不是两个 Strings 。以下方法将检查 Any 并将其转换为 t0 NSNumber 很容易将 NSNumber 转换为 IntFloat 您需要的任何数据类型。

        实际代码

        //Convert Any To Number Object Removing Optional Key Word.
        public func getNumber(number: Any) -> NSNumber{
         guard let statusNumber:NSNumber = number as? NSNumber  else {
            guard let statString:String = number as? String else {
                guard let statSubStr : Substring = number as? Substring else {
                    return 0
                }
                if let myInteger = Int(statSubStr) {
                    return NSNumber(value:myInteger)
                }
                else{
                    return 0
                }
            }
        
            if let myInteger = Int(statString) {
                return NSNumber(value:myInteger)
            }
            else if let myFloat = Float(statString) {
                return NSNumber(value:myFloat)
            }else {
                return 0
            }
        }
        return statusNumber }
        

        用法

        if let hourVal = getNumber(number: hourStr) as? Int {
        
        }
        

        传递String检查并转换为Double

        Double(getNumber(number:  dict["OUT"] ?? 0)
        

        【讨论】:

          【解决方案8】:

          对 String 到 Int 等类型有用

          extension String {
                  //Converts String to Int
                  public func toInt() -> Int? {
                      if let num = NumberFormatter().number(from: self) {
                          return num.intValue
                      } else {
                          return nil
                      }
                  }
          
                  //Converts String to Double
                  public func toDouble() -> Double? {
                      if let num = NumberFormatter().number(from: self) {
                          return num.doubleValue
                      } else {
                          return nil
                      }
                  }
          
                  /// EZSE: Converts String to Float
                  public func toFloat() -> Float? {
                      if let num = NumberFormatter().number(from: self) {
                          return num.floatValue
                      } else {
                          return nil
                      }
                  }
          
                  //Converts String to Bool
                  public func toBool() -> Bool? {
                      return (self as NSString).boolValue
                  }
              }
          

          像这样使用它:

          "123".toInt() // 123
          

          【讨论】:

            【解决方案9】:

            Swift 中的 Int 包含一个接受字符串的初始化程序。它返回一个可选的 Int?因为如果字符串不包含数字,转换可能会失败。

            通过使用 if let 语句,您可以验证转换是否成功。

            所以你的代码变成了这样:

            @IBOutlet var txtBox1 : UITextField
            @IBOutlet var txtBox2 : UITextField
            @IBOutlet var txtBox3 : UITextField
            @IBOutlet var lblAnswer : UILabel
            
            @IBAction func btn1(sender : AnyObject) {
            
                let answer1 = "The acceleration is"
                var answer2 = txtBox1
                var answer3 = txtBox2
                var answer4 = txtBox3
            
                if let intAnswer = Int(txtBox1.text) {
                  // Correctly converted
                }
            }
            

            【讨论】:

              【解决方案10】:

              在 Swift 4 中将字符串值转换为整数

              let strValue:String = "100"
              let intValue = strValue as! Int
              var intValueFromString:Int = strValue as! Int
              or
              var intValueFromString = Int(strValue)!
              

              【讨论】:

                【解决方案11】:

                我最近遇到了同样的问题。以下解决方案对我有用:

                        let strValue = "123"
                        let result = (strValue as NSString).integerValue
                

                【讨论】:

                  【解决方案12】:

                  基本理念,请注意,这只适用于 Swift 1.x(查看 ParaSara's answer 了解它在 Swift 2.x 中的工作方式):

                      // toInt returns optional that's why we used a:Int?
                      let a:Int? = firstText.text.toInt() // firstText is UITextField
                      let b:Int? = secondText.text.toInt() // secondText is UITextField
                  
                      // check a and b before unwrapping using !
                      if a && b {
                          var ans = a! + b!
                          answerLabel.text = "Answer is \(ans)" // answerLabel ie UILabel
                      } else {
                          answerLabel.text = "Input values are not numeric"
                      }
                  

                  Swift 4 更新

                  ...
                  let a:Int? = Int(firstText.text) // firstText is UITextField
                  let b:Int? = Int(secondText.text) // secondText is UITextField
                  ...
                  

                  【讨论】:

                  • 感谢这项工作。但是,我有一个问题,因为我希望数字也包括浮点数。再次感谢。
                  • 如果你需要浮点数(而且你真的想要 Double,而不是浮点数), toInt() 不会这样做。你能发挥你的想象力和可用的文档来找到一个合适的函数吗?
                  • 我收到'NSString' does not have a member named 'toInt'。有什么想法吗?
                  • NSStringString 是两个不同的对象,有不同的方法。 NSString 有一个方法叫.intValue
                  • 这个解决方案只适用于 Swift 而不适用于 Swift2。现在你应该使用: Int(firstText.text)
                  【解决方案13】:

                  因为字符串可能包含非数字字符,您应该使用guard 来保护操作。示例:

                  guard let labelInt:Int = Int(labelString) else {
                      return
                  }
                  
                  useLabelInt()
                  

                  【讨论】:

                    【解决方案14】:

                    问题:字符串“4.0000”不能用 Int("4.000") 转换成整数?

                    Answer : Int() 检查字符串是否为整数,如果是,则给您整数,否则为 nil。但是 Float 或 Double 可以将任何数字字符串转换为相应的 Float 或 Double 而无需给出 nil。例如,如果您有“45”整数字符串,但使用 Float("45") 会得到 45.0 浮点值,或者使用 Double("4567") 会得到 45.0。

                    解决方案:NSString(string: "45.000").integerValue 或 Int(Float("45.000")!)!得到正确的结果。

                    【讨论】:

                      【解决方案15】:

                      swift 4.0

                      let stringNumber = "123"
                      let number = Int(stringNumber) //here number is of type "Int?"
                      
                      
                      //using Forced Unwrapping
                      
                      if number != nil {         
                       //string is converted to Int
                      }
                      

                      您还可以使用强制绑定以外的可选绑定。

                      例如:

                        if let number = Int(stringNumber) { 
                         // number is of type Int 
                        }
                      

                      【讨论】:

                        【解决方案16】:

                        Swift 3.0

                        试试这个,你不需要检查任何条件我已经完成了一切,只需使用这个功能。 发送任何字符串、数字、浮点数、双精度等。如果无法转换您的值,您将获得一个数字作为值或 0

                        功能:

                        func getNumber(number: Any?) -> NSNumber {
                            guard let statusNumber:NSNumber = number as? NSNumber else
                            {
                                guard let statString:String = number as? String else
                                {
                                    return 0
                                }
                                if let myInteger = Int(statString)
                                {
                                    return NSNumber(value:myInteger)
                                }
                                else{
                                    return 0
                                }
                            }
                            return statusNumber
                        }
                        

                        用法: 在代码中添加上述函数并转换使用 let myNumber = getNumber(number: myString) 如果myString 有一个数字或字符串,则返回数字,否则返回0

                        示例 1:

                        let number:String = "9834"
                        print("printing number \(getNumber(number: number))")
                        

                        输出:printing number 9834

                        示例 2:

                        let number:Double = 9834
                        print("printing number \(getNumber(number: number))")
                        

                        输出:printing number 9834

                        示例 3:

                        let number = 9834
                        print("printing number \(getNumber(number: number))")
                        

                        输出:printing number 9834

                        【讨论】:

                          【解决方案17】:

                          在 Swift 4 中:

                          extension String {            
                              var numberValue:NSNumber? {
                                  let formatter = NumberFormatter()
                                  formatter.numberStyle = .decimal
                                  return formatter.number(from: self)
                              }
                          }
                          let someFloat = "12".numberValue
                          

                          【讨论】:

                            【解决方案18】:

                            swift 3 开始,我必须强制我的 #%@!带“!”的字符串和整数否则它就不起作用。

                            例如:

                            let prefs = UserDefaults.standard
                            var counter: String!
                            counter = prefs.string(forKey:"counter")
                            print("counter: \(counter!)")
                            
                            
                            var counterInt = Int(counter!)
                            counterInt = counterInt! + 1
                            print("counterInt: \(counterInt!)")
                            
                            OUTPUT:
                            counter: 1
                            counterInt: 2
                            

                            【讨论】:

                            • 你不能只做var counterInt = counter.map { Int($0) } 吗?其中counter 应该是String?
                            • @Martin - 没有。使其成为可选的,因此将单词“可选”添加到计数器字符串中。
                            • 恕我直言,您不应该强制打开您的选项。首选使用guardif let 语句
                            【解决方案19】:
                            @IBAction func calculateAclr(_ sender: Any) {
                                if let addition = addition(arrayString: [txtBox1.text, txtBox2.text, txtBox3.text]) {
                                  print("Answer = \(addition)")
                                  lblAnswer.text = "\(addition)"
                                }
                            }
                            
                            func addition(arrayString: [Any?]) -> Int? {
                            
                                var answer:Int?
                                for arrayElement in arrayString {
                                    if let stringValue = arrayElement, let intValue = Int(stringValue)  {
                                        answer = (answer ?? 0) + intValue
                                    }
                                }
                            
                                return answer
                            }
                            

                            【讨论】:

                              【解决方案20】:

                              myString.toInt() - 将字符串值转换为 int 。

                              Swift 3.x

                              如果你有一个整数隐藏在一个字符串中,你可以使用整数的构造函数进行转换,如下所示:

                              let myInt = Int(textField.text)
                              

                              与其他数据类型(Float 和 Double)一样,您也可以使用 NSString 进行转换:

                              let myString = "556"
                              let myInt = (myString as NSString).integerValue
                              

                              【讨论】:

                              • 这实际上回答了这个问题,所有其他人都告诉 OP 如何将整数作为字符串滑行,这不是他要问的
                              • 请澄清“最新的 Swift 版本”,以免后人产生混淆 :)
                              • @aremvee 您的意思是将整数“转换”为字符串吗?这到底是做什么的,它回答了其他答案没有回答的问题?
                              【解决方案21】:

                              //Xcode 8.1 和 swift 3.0

                              我们也可以通过可选绑定来处理,简单

                              let occur = "10"
                              
                              if let occ = Int(occur) {
                                      print("By optional binding :", occ*2) // 20
                              
                                  }
                              

                              【讨论】:

                                【解决方案22】:

                                最新的swift3此代码只是将字符串转换为int

                                let myString = "556"
                                let myInt = Int(myString)
                                

                                【讨论】:

                                  【解决方案23】:

                                  对于 Swift3.x

                                  extension String {
                                      func toInt(defaultValue: Int) -> Int {
                                          if let n = Int(self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)) {
                                              return n
                                          } else {
                                              return defaultValue
                                          }
                                      }
                                  }
                                  

                                  【讨论】:

                                    【解决方案24】:

                                    斯威夫特 3

                                    最简单、更安全的方法是:

                                    @IBOutlet var textFieldA  : UITextField
                                    @IBOutlet var textFieldB  : UITextField
                                    @IBOutlet var answerLabel : UILabel
                                    
                                    @IBAction func calculate(sender : AnyObject) {
                                    
                                          if let intValueA = Int(textFieldA),
                                                let intValueB = Int(textFieldB) {
                                                let result = intValueA + intValueB
                                                answerLabel.text = "The acceleration is \(result)"
                                          }
                                          else {
                                                 answerLabel.text = "The value \(intValueA) and/or \(intValueB) are not a valid integer value"
                                          }        
                                    }
                                    

                                    避免将键盘类型设置为数字键盘的无效值:

                                     textFieldA.keyboardType = .numberPad
                                     textFieldB.keyboardType = .numberPad
                                    

                                    【讨论】:

                                      【解决方案25】:

                                      我的解决方案是对字符串到 int 的转换进行通用扩展。

                                      extension String {
                                      
                                       // default: it is a number suitable for your project if the string is not an integer
                                      
                                          func toInt(default: Int) -> Int {
                                              if let result = Int(self) {
                                                  return result
                                              }
                                              else {
                                                  return default  
                                              }
                                          }
                                      
                                      }
                                      

                                      【讨论】:

                                        【解决方案26】:

                                        这对我有用

                                        var a:Int? = Int(userInput.text!)
                                        

                                        【讨论】:

                                        • 这与评论中给出的解决方案有何不同?
                                        • 评论中给出的解决方案缺少“!”最后,预计在 Swift 2 及更高版本中
                                        【解决方案27】:

                                        用于替代解决方案。您可以使用扩展本机类型。您可以在操场上进行测试。

                                        extension String {
                                            func add(a: Int) -> Int? {
                                                if let b = Int(self) {
                                                    return b + a
                                                }
                                                else {
                                                    return nil
                                                }
                                            }     
                                        }
                                        

                                        "2".add(1)

                                        【讨论】:

                                          【解决方案28】:

                                          我制作了一个简单的程序,其中您有 2 个 txt 字段,您可以从用户那里获取输入并添加它们以使其更易于理解,请找到下面的代码。

                                          @IBOutlet weak var result: UILabel!
                                          @IBOutlet weak var one: UITextField!
                                          @IBOutlet weak var two: UITextField!
                                          
                                          @IBAction func add(sender: AnyObject) {        
                                              let count = Int(one.text!)
                                              let cal = Int(two.text!)
                                              let sum = count! + cal!
                                              result.text = "Sum is \(sum)"
                                          }
                                          

                                          希望这会有所帮助。

                                          【讨论】:

                                            【解决方案29】:
                                            //  To convert user input (i.e string) to int for calculation.I did this , and it works.
                                            
                                            
                                                let num:Int? = Int(firstTextField.text!);
                                            
                                                let sum:Int = num!-2
                                            
                                                print(sum);
                                            

                                            【讨论】:

                                              【解决方案30】:

                                              关于 int() 和 Swift 2.x:如果您在转换后得到一个 nil 值,请检查您是否尝试转换具有大数字的字符串(例如:1073741824),在这种情况下尝试:

                                              let bytesInternet : Int64 = Int64(bytesInternetString)!
                                              

                                              【讨论】:

                                              • 谢谢你这对我的案子有用。 Int() 使用 16 位数字为我工作,但最近开始失败。
                                              猜你喜欢
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2014-08-01
                                              • 2017-03-19
                                              • 1970-01-01
                                              • 2014-10-09
                                              • 2016-09-06
                                              相关资源
                                              最近更新 更多