在Apple的Swift中将String转换为float

问题描述 投票:88回答:17

我试图转换从UITextField获取的数字,我认为它实际上是字符串,并将它们转换为float,所以我可以将它们相乘。

我有两个UITextfields,声明如下:

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

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

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

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

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

string floating-point swift string-parsing
17个回答
188
投票

Swift 2.0+

现在使用Swift 2.0,你可以使用返回Float(Wage.text)类型的Float?。比下面的解决方案更明确,它只返回0

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


Old Solution

处理此问题的最佳方法是直接投射:

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


2
投票

在快速4

let Totalname = "10.0" //Now it is in string

let floatVal  = (Totalname as NSString).floatValue //Now converted to float

1
投票

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

// 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;

1
投票

qazxsw poe从Int构建一个Double,如下所示:

Double()

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

toInt()

编辑:

如果你确定文本是一个整数,你可以这样做(注意UITextField上的if let wageInt = Wage.text?.toInt() { //we made it in the if so the conversion succeeded. var wageConversionDouble = Double(wageInt) } 也是可选的)):

text

1
投票

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

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

0
投票

这就是我接近它的方式。我不想“过桥”,因为它已经从Xcode 6 beta 5移除了,快速而又脏:

    var tempString:String?
    var myFloat:Float?

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

0
投票

为了完整起见,这是一个使用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") } 扩展的解决方案,它也可以考虑不同的语言环境。

适用于Swift 3+

UITextField

-1
投票

用这个:

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

-3
投票

简单的方法:

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

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


22
投票

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

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

14
投票

我以这种方式将String转换为Float:

let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue

println("number is \(numberFloatValue)") // prints "number is 15.5"

9
投票

更新

接受的答案显示了更新的做法

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

5
投票

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

因此,例如,我使用的不是使用已接受的解决方案:

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

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

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


5
投票

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

let wageConversion = Float(wage.text)

3
投票
import Foundation
"-23.67".floatValue // => -23.67

let s = "-23.67" as NSString
s.floatValue // => -23.67

3
投票

这是来自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开发人员的人!


3
投票
extension String {    
    func floatValue() -> Float? {
        return Float(self)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.