我试图转换从UITextField获取的数字,我认为它实际上是字符串,并将它们转换为float,所以我可以将它们相乘。
我有两个UITextfield
s,声明如下:
@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
当用户按下UIButton我想计算用户赚取的工资,但我不能,因为我需要先将它们转换为浮点数,然后再使用它们。
我知道如何通过这样做将它们转换为整数:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
但是,我不知道如何将它们转换为浮点数。
现在使用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确实向Swift添加了floatValue
,这将引发异常,但同时它可能会很好。如果他们稍后添加它,那么修改代码所需要做的就是删除扩展,一切都将无缝地工作,因为你已经在调用.floatValue
了!
此外,变量和常量应以小写字母开头(包括IBOutlets
)
在快速4
let Totalname = "10.0" //Now it is in string
let floatVal = (Totalname as NSString).floatValue //Now converted to float
您有两个非常相似的选项(通过方法和结果):
// 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;
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
我找到了另一种方法来获取UITextField的输入值并将其转换为浮点数:
if let wageText = Wage.text {
var wageFloat = Double(wageText.toInt()!)
}
这就是我接近它的方式。我不想“过桥”,因为它已经从Xcode 6 beta 5移除了,快速而又脏:
var tempString:String?
var myFloat:Float?
@IBAction func ButtonWasClicked(_ sender: Any) {
tempString = myUITextField.text
myFloat = Float(tempString!)!
}
为了完整起见,这是一个使用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
用这个:
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
}
}
简单的方法:
// 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"
}
您可以使用相同的方法进行其他计算,希望对此有所帮助!!
因为在世界的某些地方,例如,使用逗号而不是小数。最好创建一个NSNumberFormatter来将字符串转换为float。
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(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"
更新
接受的答案显示了更新的做法
斯威夫特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)
import Foundation
"-23.67".floatValue // => -23.67
let s = "-23.67" as NSString
s.floatValue // => -23.67
这是来自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开发人员的人!
extension String {
func floatValue() -> Float? {
return Float(self)
}
}