【问题标题】:Convert String to Float in Swift在 Swift 中将字符串转换为浮点数
【发布时间】:2014-07-27 22:48:19
【问题描述】:

我正在尝试转换从 UITextField 获取的数字,我认为它实际上是字符串,并将它们转换为浮点数,以便我可以将它们相乘。

我有两个UITextfields,声明如下:

@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField

当用户按下 UIButton 时,我想计算用户赚取的工资,但我不能,因为我需要先将它们转换为浮点数,然后才能使用它们。

我知道如何通过这样做将它们转换为整数:

var wageConversion:Int = 0
wageConversion = wage.text.toInt()!

但是,我不知道如何将它们转换为浮点数。

【问题讨论】:

    标签: string floating-point swift string-parsing


    【解决方案1】:

    Double() 从 Int 构建一个 Double,如下所示:

    var convertedDouble = Double(someInt)

    请注意,这仅在您的文本实际包含数字时才有效。由于Wage 是一个文本字段,因此用户可以输入他们想要的任何内容,当您取消对从toInt() 返回的Optional 进行拆箱时,这将触发运行时错误。您应该在强制拆箱之前检查转换是否成功。

    if let wageInt = Wage.text?.toInt() {
        //we made it in the if so the conversion succeeded.
        var wageConversionDouble = Double(wageInt)
    }
    

    编辑:

    如果你确定文本是一个整数,你可以这样做(注意 UITextField 上的text 也是可选的):

    if let wageText = Wage.text {
        var wageFloat = Double(wageText.toInt()!)
    }
    

    【讨论】:

    • 好吧,我只允许用户输入数字,因为小键盘是十进制键盘,所以他们实际上不能输入除数字以外的任何内容。
    • wageConversionFloat 永远不会是浮点数,如果输入字符串是像234.56 这样的浮点数,它会直接崩溃。它怎么可能是一个被接受/赞成的解决方案......?
    • 如果文本包含十进制值,则此答案无效。示例 - 如果文本字段具有 3.5,则此答案将返回 3。这是因为文本首先转换为Int,然后Int 转换为Float
    • @StephenFox 请记住,用户可以将非数字文本粘贴到文本字段中,或者用户可能有外部键盘。切勿仅依靠键盘来确保数据输入。
    • 实际上它确实可以使用整数,而不是小数。小数会引发致命错误!
    【解决方案2】:

    斯威夫特 2.0+

    现在使用 Swift 2.0,您只需使用 Float(Wage.text) 即可返回 Float? 类型。比下面只返回 0 的解决方案更清楚。

    如果您出于某种原因想要一个无效的Float0 值,您可以使用Float(Wage.text) ?? 0,如果它不是有效的Float,它将返回0


    旧解决方案

    处理这个问题的最好方法是直接转换:

    var WageConversion = (Wage.text as NSString).floatValue
    

    我实际上创建了一个extension 来更好地使用它:

    extension String {
        var floatValue: Float {
            return (self as NSString).floatValue
        }
    }
    

    现在您只需拨打var WageConversion = Wage.text.floatValue 并让分机为您处理网桥!

    这是一个很好的实现,因为它可以处理实际的浮点数(使用. 输入),还有助于防止用户将文本复制到您的输入字段(12p.34,甚至12.12.41)。

    显然,如果 Apple 确实向 Swift 添加了floatValue,这将引发异常,但同时它可能会很好。如果他们稍后添加它,那么您修改代码所需要做的就是删除扩展名,一切都会无缝运行,因为您已经调用了.floatValue

    另外,变量和常量应该以小写开头(包括IBOutlets

    【讨论】:

    • 不需要扩展,桥接由 Swift 自动完成,因为@tom 声明您只需要 Wage.text.floatValue。不确定这在发布答案和现在之间是否发生了变化,但它已经存在了一段时间。
    • @GoodbyeStackOverflow,我使用的是 Beta 4,它肯定不起作用。也许他们在 Beta 5 中改变了它? NSStringfloatValue 扩展名,但 String 没有。获取错误:'String' does not have member named floatValue
    • 这可能是原因。另外,你的文件顶部有 import Foundation 吗?
    • 我认为这不是很安全,至少对于 Swift 标准而言,因为如果字符串不是数字,NSString.floatValue 只会返回 0。这应该会触发异常或至少返回 nil。
    • let floatValue = (Float)(Wage.text) ... 在 Swift 2.0 中
    【解决方案3】:

    简单的方法:

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

    您可以使用相同的方法进行其他计算,希望对您有所帮助!

    【讨论】:

    • 尽管如此,他要求float
    【解决方案4】:

    使用这个:

     // get the values from text boxes
        let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
        let b:Double = secondText.text.bridgeToObjectiveC().doubleValue
    
    //  we checking against 0.0, because above function return 0.0 if it gets failed to convert
        if (a != 0.0) && (b != 0.0) {
            var ans = a + b
            answerLabel.text = "Answer is \(ans)"
        } else {
            answerLabel.text = "Input values are not numberic"
        }
    

    【讨论】:

    • bridgeToObjectiveC() 在 Beta 5 中被移除
    【解决方案5】:

    您有两个非常相似的选项(方法和结果):

    // option 1:
    var string_1 : String = "100"
    var double_1 : Double = (string_1 as NSString).doubleValue + 99.0
    
    // option 2: 
    var string_2 : NSString = "100"
    // or:  var string_2 = "100" as NSString
    var number_2 : Double = string_2.doubleValue;
    

    【讨论】:

    • bridgeToObjectiveC() 在 Beta 5 中被移除
    【解决方案6】:

    因为在世界的某些地方,例如,使用逗号而不是小数。最好创建一个 NSNumberFormatter 来将字符串转换为浮点数。

    let numberFormatter = NSNumberFormatter()
    numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
    let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))
    

    【讨论】:

      【解决方案7】:
      import Foundation
      "-23.67".floatValue // => -23.67
      
      let s = "-23.67" as NSString
      s.floatValue // => -23.67
      

      【讨论】:

      • 解释为什么这段代码有效。这可以防止在不了解其操作的情况下进行复制和粘贴。
      【解决方案8】:

      这就是我的处理方式。我不想“过桥”,因为无论如何它已经从 Xcode 6 beta 5 中删除了,又快又脏:

      extension String {
      
          // converting a string to double
          func toDouble() -> Double? {
      
              // split the string into components
              var comps = self.componentsSeparatedByString(".")
      
              // we have nothing
              if comps.count == 0 {
                  return nil
              }
              // if there is more than one decimal
              else if comps.count > 2 {
                  return nil
              }
              else if comps[0] == "" || comps[1] == "" {
                  return nil
              }
      
              // grab the whole portion
              var whole = 0.0
              // ensure we have a number for the whole
              if let w = comps[0].toInt() {
                  whole = Double(w)
              }
              else {
                  return nil
              }
      
              // we only got the whole
              if comps.count == 1 {
      
                  return whole
      
              }
      
              // grab the fractional
              var fractional = 0.0
              // ensure we have a number for the fractional
              if let f = comps[1].toInt() {
      
                  // use number of digits to get the power
                  var toThePower = Double(countElements(comps[1]))
      
                  // compute the fractional portion
                  fractional = Double(f) / pow(10.0, toThePower)
      
              }
              else {
                  return nil
              }
      
              // return the result
              return whole + fractional
          }
      
          // converting a string to float
          func toFloat() -> Float? {
      
              if let val = self.toDouble() {
                  return Float(val)
              }
              else {
                  return nil
              }
      
          }
      
      }
      
      
      // test it out
      var str = "78.001"
      
      if let val = str.toFloat() {
          println("Str in float: \(val)")
      }
      else {
          println("Unable to convert Str to float")
      }
      
      // now in double
      if let val = str.toDouble() {
          println("Str in double: \(val)")
      }
      else {
          println("Unable to convert Str to double")
      }
      

      【讨论】:

      • 因为在世界的某些地方,例如,使用逗号而不是小数。最好创建一个 NSNumberFormatter 将字符串转换为浮点数。看看@DmitriFuerle 答案
      • @PartiallyFrozenOJ 您是否尝试过带有“10”字符串的toDouble() 函数我的意思是如果没有小数点。无论如何它都会崩溃。因为在这种情况下,计数将为 1,而您没有处理它。它将在 else if comps[0] == "" || comps[1] == "" 崩溃。无论如何,你在转换方面是如此认真。
      • @PartiallyFrozenOJ 但如果 2014 年的情况也一样。反正没问题!
      【解决方案9】:

      我是这样把String转成Float的:

      let numberFormatter = NSNumberFormatter()
      let number = numberFormatter.numberFromString("15.5")
      let numberFloatValue = number.floatValue
      
      println("number is \(numberFloatValue)") // prints "number is 15.5"
      

      【讨论】:

      • 我认为这是最好的解决方案(至少对于 swift 4+),主要原因是它返回一个可选的(而不是NSString.floatValue,如果有什么问题,它只是返回0错误的。)。请注意,NSNumberFormatter 已更改为 NumberFormatter
      【解决方案10】:

      使用公认的解决方案,我发现我的“1.1”(使用 .floatValue 转换时)将转换为 1.10000002384186,这不是我想要的。但是,如果我改用 .doubleValue,我会得到我想要的 1.1。

      例如,我没有使用公认的解决方案,而是使用了这个:

      var WageConversion = (Wage.text as NSString).doubleValue
      

      在我的情况下,我不需要双精度,但使用 .floatValue 并没有给我正确的结果。

      只是想将此添加到讨论中,以防其他人遇到同样的问题。

      【讨论】:

        【解决方案11】:

        更新

        接受的答案显示了一种更新的方式

        斯威夫特 1

        这就是 Paul Hegarty 在 2015 年斯坦福 CS193p 课程中的表现:

        wageConversion = NSNumberFormatter().numberFromString(wage.text!)!.floatValue
        

        您甚至可以创建一个计算属性,而不必每次都这样做

        var wageValue: Float {
                get {
                    return NSNumberFormatter().numberFromString(wage.text!)!.floatValue
                }
                set {
                    wage.text = "\(newValue)"
                }
            }
        

        【讨论】:

          【解决方案12】:

          下面会给你一个可选的浮动,坚持一个!最后,如果你知道它是一个浮点数,或者使用 if/let。

          let wageConversion = Float(wage.text)
          

          【讨论】:

            【解决方案13】:
            extension String {    
                func floatValue() -> Float? {
                    return Float(self)
                }
            }
            

            【讨论】:

            • 为什么不简单地return Float(self)
            【解决方案14】:

            这是对 rdprado 回答中 Paul Hegarty 解决方案的 Swift 3 改编,其中添加了一些选项检查(如果过程的任何部分失败,则返回 0.0):

            var wageFloat:Float = 0.0
            
            if let wageText = wage.text {
                if let wageNumber = NumberFormatter().number(from: wageText) {
                    wageFloat = wageNumber.floatValue
                }
            }
            

            顺便说一句,当斯坦福大学还在教 Objective-C 时,我使用 iTunes 大学参加了斯坦福的 CS193p 课程。

            我发现 Paul Hegarty 是一位出色的讲师,我强烈推荐这门课程给任何刚开始使用 Swift 开发 iOS 开发人员的人!!!

            【讨论】:

            • 这是 Swift 3 或更高版本的唯一正确答案。您必须使用NumberFormatter 来处理用户输入的浮点数。
            【解决方案15】:

            为了完整起见,这是一个使用 UITextField 扩展的解决方案,它也可以考虑不同的语言环境。

            对于 Swift 3+

            extension UITextField {
                func floatValue(locale : Locale = Locale.current) -> Float {
                    let numberFormatter = NumberFormatter()
                    numberFormatter.numberStyle = .decimal
                    numberFormatter.locale = locale
            
                    let nsNumber = numberFormatter.number(from: text!)
                    return nsNumber == nil ? 0.0 : nsNumber!.floatValue
                }
            }
            

            【讨论】:

            • 作为一般解决方案,这可能应该返回Float?,而不是将无效值视为0.0。如果给定的情况应将不良结果视为零,则让调用者执行let val = field.floatValue ?? 0.0 之类的操作。
            【解决方案16】:

            我找到了另一种方法来获取 UITextField 的输入值并将其转换为浮点数:

                var tempString:String?
                var myFloat:Float?
            
                @IBAction func ButtonWasClicked(_ sender: Any) {
                   tempString = myUITextField.text
                   myFloat = Float(tempString!)!
                }
            

            【讨论】:

              【解决方案17】:

              在 Swift 4 中

              let Totalname = "10.0" //Now it is in string
              
              let floatVal  = (Totalname as NSString).floatValue //Now converted to float
              

              【讨论】:

                【解决方案18】:

                Swift 4/5,只使用 Float(value)。

                let string_value : String = "123200"
                
                let float_value : Float = Float(string_value)
                
                print(float_value)
                

                答案:123200

                【讨论】:

                  【解决方案19】:

                  你可以使用,

                  let wg = Float(wage.text!)
                  

                  如果要将浮点数四舍五入到小数点后 2 位:

                  let wg = Float(String(format: "%.2f",wage.text!)
                  

                  【讨论】:

                    【解决方案20】:
                    Works on Swift 5+
                    
                    import Foundation
                    
                    let myString:String = "50"
                    let temp = myString as NSString
                    let myFloat = temp.floatValue
                    print(myFloat)  //50.0
                    print(type(of: myFloat)) // Float
                    

                    // 你也可以保护你的值,以便在你的应用崩溃时检查发生了什么。

                    guard let myFloat = temp.floatValue else {
                    fatalError(" fail to change string to float value.")
                    }
                    

                    【讨论】:

                    • 请添加一些解释。
                    • 一般将String直接改成float值会失败。所以首先我们必须将其更改为 NS 字符串然后浮动。这样xcode也变得开心了哈哈。
                    【解决方案21】:

                    在 Xcode 11 中将字符串转换为浮点数 因为以前的方法需要修改

                    func stringToFloat(value : String) -> Float {
                        let numberFormatter = NumberFormatter()
                        let number = numberFormatter.number(from: value)
                        let numberFloatValue = number?.floatValue
                        return numberFloatValue!
                    }
                    

                    【讨论】:

                      【解决方案22】:

                      我是这样把String转成Float的:

                      let wage:Float = Float(textField.text!)!
                      

                      【讨论】:

                        猜你喜欢
                        • 2011-11-25
                        • 1970-01-01
                        • 2014-09-25
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-06-21
                        相关资源
                        最近更新 更多