在Swift中将字符串转换为浮点数

116

我试图将从一个 UITextField 中获取的数字(我认为是字符串)转换为 Float,以便我可以对它们进行乘法运算。

我有两个 UITextfield,它们声明如下:

@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
当用户按下UIButton时,我想计算用户所赚取的工资,但是我无法计算,因为我需要先将它们转换为浮点数才能使用。 我知道如何通过这样做将它们转换为整数:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!

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

22个回答

217

Swift 2.0+

现在使用Swift 2.0,您可以直接使用Float(Wage.text)来返回Float?类型。比下面的解决方案更清晰,后者只会返回0

如果由于某些原因您想要将无效的Float值设置为0,则可以使用Float(Wage.text) ?? 0,如果它不是有效的Float,它将返回0


旧解决方案

处理这个问题的最佳方法是使用直接强制转换:

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

我实际上创建了一个 扩展程序,以更好地使用它:

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

现在你只需要调用var WageConversion = Wage.text.floatValue,让这个扩展程序为你处理桥接,这是一个不错的实现方案,因为它可以处理实际浮点数(输入带有.),并且还可以防止用户将文本复制到您的输入字段中(12p.34,甚至12.12.41)。

显然,如果苹果公司向Swift添加了floatValue,那么这将会出现异常,但在此期间使用起来可能很好。 如果他们以后添加它,那么你只需删除扩展程序即可修改代码,并且一切都能无缝运作,因为你已经在调用.floatValue

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


不需要扩展,Swift会自动完成桥接,正如@tom所说,你只需要使用Wage.text.floatValue。不确定答案发布和现在之间是否有变化,但这个方法已经存在一段时间了。 - sketchyTech
3
@GoodbyeStackOverflow,我使用Beta 4版本时,它明显不起作用。也许他们在Beta 5中做了更改?NSStringfloatValue扩展,但String没有。会出现错误:'String' does not have member named floatValue - Firo
这可能是原因。另外,你的文件顶部是否导入了Foundation? - sketchyTech
我认为这种方法并不是很安全,至少对于Swift标准而言。因为如果字符串不是一个数字,NSString.floatValue方法会返回0,而不会触发异常或者返回nil。 - User
在 Swift 2.0 中,代码为:let floatValue = (Float)(Wage.text) - TheTiger
显示剩余2条评论

25
由于在世界某些地区,例如使用逗号而非小数点。为了将字符串转换为浮点数,最好创建一个NSNumberFormatter。
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))

20

我这样将字符串转换为浮点数:

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

9

更新

接受的答案展示了一种更加现代的实现方法。

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

7

下面会给你一个可选的浮点数,如果你知道它是浮点数,在末尾加上!,或使用if/let语句。

let wageConversion = Float(wage.text)

6
使用已接受的解决方案时,我发现我的"1.1"(使用.floatValue转换)会被转换为1.10000002384186,这不是我想要的。 但是,如果我改用.doubleValue,则可以得到我想要的1.1。
例如,我使用了以下代码而非已接受的解决方案:
var WageConversion = (Wage.text as NSString).doubleValue

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

只是想把这个加入到讨论中,以防其他人遇到同样的问题。


4
这是对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 University参加了斯坦福的CS193p班级。

我发现Paul Hegarty是一位非常出色的讲师,强烈推荐这门课程给那些想要从Swift入门iOS开发的人!!!


1
这是Swift 3或更高版本的唯一正确答案。您必须使用NumberFormatter来处理用户输入的浮点数。 - rmaddy

4
extension String {    
    func floatValue() -> Float? {
        return Float(self)
    }
}

2
为什么不直接写成 return Float(self) 呢? - Leo Dabus

3
在Swift 4中
let Totalname = "10.0" //Now it is in string

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

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

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

3
为什么这段代码能够运行?为了防止抄袭和无法理解其操作而进行复制粘贴。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接