我正在尝试转换从UITextField获取的数字,我认为它实际上是字符串,并将它们转换为float,因此我可以将它们相乘。
我有两个UITextfield
声明如下:
@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
当用户按下UIButton时,我想计算用户赚取的工资,但我不能,因为我需要先将它们转换为浮点数,然后再使用它们。
我知道如何通过这样做将它们转换为整数:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
但是,我不知道如何将它们转换为花车。
答案 0 :(得分:184)
现在使用 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
,甚至{{1} })。
显然,如果Apple确实向Swift添加了12.12.41
,这将抛出一个异常,但同时它可能会很好。如果他们稍后添加它,那么修改代码所需要做的就是删除扩展,所有内容都将无缝地工作,因为您已经在调用floatValue
!
此外,变量和常量应以小写字母(包括.floatValue
)
答案 1 :(得分:22)
因为在世界的某些地方,例如,使用逗号而不是小数。最好创建一个NSNumberFormatter来将字符串转换为float。
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))
答案 2 :(得分:14)
我以这种方式将String转换为Float:
let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue
println("number is \(numberFloatValue)") // prints "number is 15.5"
答案 3 :(得分: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)"
}
}
答案 4 :(得分:5)
下面会给你一个可选的Float,坚持一个!最后如果你知道它是Float,或者使用if / let。
let wageConversion = Float(wage.text)
答案 5 :(得分:5)
使用已接受的解决方案,我发现我的“1.1”(当使用.floatValue转换时)将转换为1.10000002384186,这不是我想要的。但是,如果我使用.doubleValue代替,我会得到我想要的1.1。
因此,例如,我使用了这个而不是使用已接受的解决方案:
var WageConversion = (Wage.text as NSString).doubleValue
在我的情况下,我不需要双精度,但使用.floatValue并没有给我正确的结果。
只是想将其添加到讨论中以防其他人遇到同样的问题。
答案 6 :(得分:3)
import Foundation
"-23.67".floatValue // => -23.67
let s = "-23.67" as NSString
s.floatValue // => -23.67
答案 7 :(得分:3)
extension String {
func floatValue() -> Float? {
return Float(self)
}
}
答案 8 :(得分:3)
以下是来自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开发人员的人!
答案 9 :(得分:1)
您有两个非常相似的选项(通过方法和结果):
// 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;
答案 10 :(得分:1)
Double()
从Int构建一个Double,如下所示:
var convertedDouble = Double(someInt)
请注意,这仅适用于文本实际包含数字的情况。由于Wage
是一个文本字段,因此用户可以输入他们想要的任何内容,当您转到从toInt()
返回的Optional时,这将触发运行时错误。在强制取消装箱之前,您应该检查转换是否成功。
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()!)
}
答案 11 :(得分:1)
我找到了另一种方法来获取UITextField的输入值并将其转换为浮点数:
var tempString:String?
var myFloat:Float?
@IBAction func ButtonWasClicked(_ sender: Any) {
tempString = myUITextField.text
myFloat = Float(tempString!)!
}
答案 12 :(得分:1)
快速4
let Totalname = "10.0" //Now it is in string
let floatVal = (Totalname as NSString).floatValue //Now converted to float
答案 13 :(得分:1)
您可以使用
let wg = Float(wage.text!)
如果您想将浮点数舍入到小数点后两位:
let wg = Float(String(format: "%.2f",wage.text!)
答案 14 :(得分:1)
我以这种方式将 String 转换为 Float:
let wage:Float = Float(textField.text!)!
答案 15 :(得分:0)
这就是我接近它的方式。我不想“越过桥梁”,因为它已经从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")
}
答案 16 :(得分:0)
为了完整起见,这是一个使用UITextField
扩展名的解决方案,它也可以考虑不同的区域设置。
对于Swift 3 +
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
}
}
答案 17 :(得分:0)
迅速4/5,仅使用Float(value)。
let string_value : String = "123200"
let float_value : Float = Float(string_value)
print(float_value)
答案:123200
答案 18 :(得分:0)
Works on Swift 5+
import Foundation
let myString:String = "50"
let temp = myString as NSString
let myFloat = temp.floatValue
print(myFloat) //50.0
print(type(of: myFloat)) // Float
//同样,您可以保护自己的价值,以检查应用程序崩溃时正在发生的事情。
guard let myFloat = temp.floatValue else {
fatalError(" fail to change string to float value.")
}
答案 19 :(得分:0)
在 Xcode 11 中将字符串转换为 Float 因为之前的方法需要修改
func stringToFloat(value : String) -> Float {
let numberFormatter = NumberFormatter()
let number = numberFormatter.number(from: value)
let numberFloatValue = number?.floatValue
return numberFloatValue!
}
答案 20 :(得分:-1)
使用此:
// 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"
}
答案 21 :(得分:-3)
简单方法:
// 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"
}
你可以使用相同的方法进行其他计算,希望这有帮助!