将string转换为浮动在苹果的Swift中

我试图转换从UITextField,我认为,实际上是string采取的数字,并将其转换为浮动,所以我可以乘以它们。

我有两个UITextfield ,声明如下:

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

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

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

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

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

Swift 2.0+

现在使用Swift 2.0,你可以使用Float(Wage.text) ,它返回一个Float? types。 比下面刚刚返回0解决scheme更清楚。

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


旧解决scheme

处理这个最好的方法是直接投射:

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

我实际上创build了一个extension以更好地使用这个:

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

现在,您可以调用var WageConversion = Wage.text.floatValue并允许扩展为您处理桥梁!

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

显然,如果苹果给Swift添加一个floatValue ,这将抛出一个exception,但同时它可能会很好。 如果他们稍后添加它,那么只需要修改代码即可删除扩展,所有内容都可以无缝工作,因为您已经在调用.floatValue

另外,variables和常量应以小写字母开头(包括IBOutlets

因为在世界的一些地方,例如逗号被用来代替小数。 最好创build一个NSNumberFormatter将string转换为浮点型。

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

我以这种方式将string转换为浮点数:

 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课堂上的performance:

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

你甚至可以创build一个计算属性,而不必每次都这么做

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

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

所以举个例子,我用这个代替了接受的解决scheme:

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

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

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

下面会给你一个可选的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 
 extension String { func floatValue() -> Float? { if let floatval = Float(self) { return floatval } return nil } } 

这就是我接触它的方式。 我不想“过桥”,因为它已经从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") } 

你有两个非常相似的select(通过方法和结果):

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

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

var convertedDouble = Double(someInt)

请注意,这只有在您的文字实际上包含数字时才有效。 由于Wage是一个文本字段,用户可以input任何他们想要的东西,这将触发一个运行时错误,当你去解除toInt()返回的可选。 在强制拆箱之前,您应该检查转换是否成功。

 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()!) } 

这里是rdprado答案的Paul Hegarty解决scheme的Swift 3改编,join了一些可选项的检查(如果进程的任何部分失败,则返回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是一名FANTASTIC教练,我会强烈推荐这个class级给任何以Swift开始的iOS开发者!

用这个:

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

简单的方法:

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

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