String 在Swift中将字符串转换为浮点

String 在Swift中将字符串转换为浮点,string,floating-point,swift,string-parsing,String,Floating Point,Swift,String Parsing,我试着把取自UITextField的数字转换成字符串,然后把它们转换成Float,这样我就可以把它们相乘 我有两个UITextfields,声明如下: @IBOutlet var wage: UITextField @IBOutlet var hour: UITextField 当用户按下UIButton时,我想计算用户的工资,但我不能,因为我需要先将它们转换为浮动,然后才能使用它们 我知道如何通过以下操作将它们转换为整数: var wageConversion:Int = 0 wageCon

我试着把取自UITextField的数字转换成字符串,然后把它们转换成Float,这样我就可以把它们相乘

我有两个
UITextfield
s,声明如下:

@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
当用户按下UIButton时,我想计算用户的工资,但我不能,因为我需要先将它们转换为浮动,然后才能使用它们

我知道如何通过以下操作将它们转换为整数:

var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
但是,我不知道如何将它们转换为浮点。

Double()

var convertedDouble=Double(someInt)

请注意,这仅在文本实际包含数字时才起作用。由于
Wage
是一个文本字段,用户可以输入他们想要的任何内容,当您去取消绑定从
toInt()
返回的可选项时,这将触发运行时错误。在强制取消装箱之前,应检查转换是否成功

if let wageInt = Wage.text?.toInt() {
    //we made it in the if so the conversion succeeded.
    var wageConversionDouble = Double(wageInt)
}
编辑:

如果您确定文本将是一个整数,则可以执行如下操作(注意,UITextField上的
text
on也是可选的):

Swift 2.0+ 现在使用Swift 2.0您可以使用
Float(Wage.text)
返回
Float?
类型。比下面只返回
0
的解决方案更清晰

如果出于某种原因,您希望为无效的
Float
设置
0
值,您可以使用
Float(Wage.text)??0
如果它不是有效的
浮点
,将返回
0


老办法 处理此问题的最佳方法是直接浇铸:

var WageConversion = (Wage.text as NSString).floatValue
实际上,我创建了一个
扩展
,以便更好地使用它:

extension String {
    var floatValue: Float {
        return (self as NSString).floatValue
    }
}
现在,您只需调用
var WageConversion=Wage.text.floatValue
,并允许扩展为您处理桥接

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

显然,如果苹果真的在Swift中添加了一个
floatValue
,这将抛出一个异常,但同时它可能会很好。如果他们以后添加了它,那么修改代码所需要做的就是删除扩展名,一切都将无缝工作,因为您已经在调用
.floatValue

此外,变量和常量应以小写开头(包括
IBOutlets

简易方式:

// 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"
}
您可以使用相同的方法进行其他计算,希望对您有所帮助

使用以下命令:

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

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

我通过以下方式将字符串转换为浮点:

let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue

println("number is \(numberFloatValue)") // prints "number is 15.5"
let wage:Float = Float(textField.text!)!

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

例如,我没有使用公认的解决方案,而是使用了:

var WageConversion = (Wage.text as NSString).doubleValue
在我的例子中,我不需要双重精度,但使用.floatValue并没有给出正确的结果


只是想在讨论中添加此内容,以防其他人遇到同样的问题。

更新

公认的答案显示了一种更为现代的做法

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

下面将给你一个可选的浮动,坚持一个!最后,如果您知道它是一个Float,或者使用if/let

let wageConversion = Float(wage.text)

以下是根据rdprado的答案对Paul Hegarty的解决方案进行的Swift 3改编,其中添加了一些选项检查(如果流程的任何部分失败,则返回0.0):

顺便说一句,我用iTunes大学参加了斯坦福大学的CS193p课程,当时它还在教Objective-C


我发现Paul Hegarty是一位非常棒的讲师,我会向任何一位在Swift开始作为iOS开发者的人强烈推荐这门课

> P>为了完整性,这是一个使用<>代码> UITExtField>代码>的解决方案,它也可以考虑不同的区域。 斯威夫特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
    }
}

我找到了另一种方法来获取UITextField的输入值并将其转换为float:

    var tempString:String?
    var myFloat:Float?

    @IBAction func ButtonWasClicked(_ sender: Any) {
       tempString = myUITextField.text
       myFloat = Float(tempString!)!
    }
斯威夫特4

let Totalname = "10.0" //Now it is in string

let floatVal  = (Totalname as NSString).floatValue //Now converted to float
Swift 4/5,仅使用浮动(值)

回答:123200

您可以使用

let wg = Float(wage.text!)
如果要将浮点值四舍五入到小数点后2位:

let wg = Float(String(format: "%.2f",wage.text!)
//此外,你还可以保护你的价值观,以便在你的应用程序崩溃时检查发生了什么

guard let myFloat = temp.floatValue else {
fatalError(" fail to change string to float value.")
}

在Xcode 11中将字符串转换为浮点 因为以前的方法需要修改

func stringToFloat(value : String) -> Float {
    let numberFormatter = NumberFormatter()
    let number = numberFormatter.number(from: value)
    let numberFloatValue = number?.floatValue
    return numberFloatValue!
}

我通过以下方式将字符串转换为浮点:

let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue

println("number is \(numberFloatValue)") // prints "number is 15.5"
let wage:Float = Float(textField.text!)!

嗯,我只允许用户输入数字,因为键盘是十进制键盘,所以他们实际上只能输入数字。
wageConversionFloat
永远不会是浮点数,如果输入字符串是类似于
234.56
的浮点数,它会直接崩溃。这怎么可能是一个被接受/投票表决的解决方案…?如果文本包含十进制值,则此答案不起作用。示例-如果文本字段具有
3.5
,则此答案将返回
3
。这是因为文本首先转换为
Int
,然后
Int
转换为
Float
@StephenFox请记住,用户可以将非数字文本粘贴到文本字段中,或者用户可能有一个外部键盘。永远不要仅仅依靠键盘来确保数据输入。事实上,对于整数,它确实有效
let wg = Float(String(format: "%.2f",wage.text!)
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.")
}
func stringToFloat(value : String) -> Float {
    let numberFormatter = NumberFormatter()
    let number = numberFormatter.number(from: value)
    let numberFloatValue = number?.floatValue
    return numberFloatValue!
}
let wage:Float = Float(textField.text!)!