将String转换为在Apple的Swift中浮动

时间:2014-06-06 15:35:44

标签: string floating-point swift string-parsing

我正在尝试转换从UITextField获取的数字,我认为它实际上是字符串,并将它们转换为float,因此我可以将它们相乘。

我有两个UITextfield声明如下:

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

当用户按下UIButton时,我想计算用户赚取的工资,但我不能,因为我需要先将它们转换为浮点数,然后再使用它们。

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

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

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

22 个答案:

答案 0 :(得分:184)

Swift 2.0+

现在使用 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"
}

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