我试图转换从UITextField获取的数字,我认为它实际上是字符串,并将它们转换为float,所以我可以将它们相乘.
我有两个UITextfield
s声明如下:
@IBOutlet var wage: UITextField @IBOutlet var hour: UITextField
当用户按下UIButton我想计算用户赚取的工资,但我不能,因为我需要先将它们转换为浮点数,然后再使用它们.
我知道如何通过这样做将它们转换为整数:
var wageConversion:Int = 0 wageConversion = wage.text.toInt()!
但是,我不知道如何将它们转换为浮点数.
因为在世界的某些地方,例如,使用逗号而不是小数.最好创建一个NSNumberFormatter来将字符串转换为float.
let numberFormatter = NSNumberFormatter() numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))
现在使用Swift 2.0,您可以使用Float(Wage.text)
返回Float?
类型.比刚刚返回的下面的解决方案更清楚0
.
如果由于某种原因0
需要无效值,则Float
可以使用Float(Wage.text) ?? 0
,0
如果无效,则返回该值Float
.
处理此问题的最佳方法是直接投射:
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确实floatValue
向Swift 添加了一个,那么会抛出异常,但同时它可能会很好.如果他们稍后添加它,那么修改代码所需要做的就是删除扩展,一切都将无缝地工作,因为你已经在调用了.floatValue
!
此外,变量和常量应以小写字母开头(包括IBOutlets
)
更新
接受的答案显示了更新的做法
斯威夫特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)" } }
使用接受的解决方案,我发现我的"1.1"(当使用.floatValue转换时)将转换为1.10000002384186,这不是我想要的.但是,如果我使用.doubleValue代替,我会得到我想要的1.1.
因此,例如,我使用的不是使用已接受的解决方案:
var WageConversion = (Wage.text as NSString).doubleValue
在我的情况下,我不需要双精度,但使用.floatValue并没有给我正确的结果.
只是想将其添加到讨论中以防其他人遇到同样的问题.
下面会给你一个可选的Float,坚持一个!最后如果你知道它是Float,或者使用if/let.
let wageConversion = Float(wage.text)
我以这种方式将String转换为Float:
let numberFormatter = NSNumberFormatter() let number = numberFormatter.numberFromString("15.5") let numberFloatValue = number.floatValue println("number is \(numberFloatValue)") // prints "number is 15.5"