将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更清楚。
如果你想为一个无效的Float
为0
值由于某种原因,你可以使用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" }
你可以使用相同的方法进行其他计算,希望这有帮助!