web-dev-qa-db-de.com

Konvertieren Sie String in Float in Apple Swift

Ich versuche, Zahlen aus einem UITextField zu konvertieren, von denen ich annehme, dass sie tatsächlich Strings sind, und diese in Float konvertieren, sodass ich sie multiplizieren kann.

Ich habe zwei UITextfields, die wie folgt deklariert sind:

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

Wenn der Benutzer einen UIButton drückt, möchte ich die Löhne berechnen, die der Benutzer verdient, aber ich kann es nicht, da ich sie zuerst in Floats umwandeln muss, bevor ich sie verwenden kann.

Ich weiß, wie ich sie in eine Ganzzahl konvertieren kann:

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

Ich habe jedoch keine Ahnung, wie ich sie in Floats umwandeln soll.

85
Stephen Fox

Swift 2.0+ 

Jetzt mit Swift 2.0 können Sie einfach Float(Wage.text) verwenden, die einen Float?-Typ zurückgibt. Klarer als die untenstehende Lösung, die nur 0 zurückgibt.

Wenn Sie aus einem bestimmten Grund einen 0-Wert für eine ungültige Float benötigen, können Sie Float(Wage.text) ?? 0 verwenden, die 0 zurückgibt, wenn es keine gültige Float ist.


Alte Lösung

Der beste Weg, um damit umzugehen, ist direktes Casting:

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

Ich habe tatsächlich eine extension erstellt, um das auch besser zu nutzen:

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

Jetzt können Sie einfach var WageConversion = Wage.text.floatValue anrufen und zulassen, dass die Erweiterung die Bridge für Sie übernimmt!

Dies ist eine gute Implementierung, da sie mit tatsächlichen Floats (Eingabe mit .) umgehen kann und außerdem verhindert, dass Benutzer Text in Ihr Eingabefeld kopieren (12p.34 oder sogar 12.12.41).

Wenn Apple Swift zwar eine floatValue hinzufügt, wird dies natürlich eine Ausnahme auslösen. In der Zwischenzeit kann dies jedoch Nizza sein. Wenn Sie es später hinzufügen, müssen Sie nur die Erweiterung entfernen, um den Code zu ändern. Alles funktioniert nahtlos, da Sie .floatValue bereits aufrufen.

Außerdem sollten Variablen und Konstanten mit einer Kleinschreibung beginnen (einschließlich IBOutlets).

179
Firo

In einigen Teilen der Welt wird zum Beispiel ein Komma anstelle eines Dezimalzeichens verwendet. Es ist am besten, einen NSNumberFormatter zu erstellen, um eine Zeichenfolge in Float zu konvertieren.

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

Ich konvertiere String in Float auf diese Weise:

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

println("number is \(numberFloatValue)") // prints "number is 15.5"
14
Mert

Update

Die akzeptierte Antwort zeigt eine aktuellere Vorgehensweise

Swift 1

So hat Paul Hegarty 2015 die Stanford CS193p-Klasse gezeigt:

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

Sie können sogar eine berechnete Eigenschaft erstellen, die Sie nicht jedes Mal tun müssen

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

Im Folgenden erhalten Sie einen optionalen Float. am Ende, wenn Sie wissen, dass es ein Float ist, oder verwenden Sie if/let. 

let wageConversion = Float(wage.text)
5
bandejapaisa

Bei Verwendung der akzeptierten Lösung stellte ich fest, dass meine "1.1" (bei Verwendung der .floatValue-Konvertierung) auf 1.10000002384186 konvertiert wurde. Wenn ich jedoch stattdessen den .doubleValue verwendet, würde ich die 1.1 bekommen, die ich wollte.

Anstelle der akzeptierten Lösung habe ich beispielsweise Folgendes verwendet:

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

In meinem Fall brauchte ich keine doppelte Genauigkeit, aber die Verwendung des .floatValue-Tests hat mir nicht das richtige Ergebnis geliefert. 

Ich wollte das nur in die Diskussion aufnehmen, falls jemand anderes auf das gleiche Thema gestoßen wäre.

5
Yjo-jo
import Foundation
"-23.67".floatValue // => -23.67

let s = "-23.67" as NSString
s.floatValue // => -23.67
3
tom

Hier ist eine Swift-3-Adaption von Paul Hegartys Lösung aus der Antwort von rdprado. Einige Optionen wurden hinzugefügt (es wird 0.0 zurückgegeben, wenn ein Teil des Prozesses fehlschlägt):

var wageFloat:Float = 0.0

if let wageText = wage.text {
    if let wageNumber = NumberFormatter().number(from: wageText) {
        wageFloat = wageNumber.floatValue
    }
}

Ich habe übrigens Stanfords CS193p-Kurs an der iTunes University besucht, als er noch Objective-C unterrichtete. 

Ich fand, dass Paul Hegarty ein FANTASTIC-Instruktor war, und ich würde die Klasse jedem empfehlen, der als iOS-Entwickler in Swift anfängt !!!

3
Carl Smith
extension String {    
    func floatValue() -> Float? {
        if let floatval = Float(self) {
            return floatval
        }
        return nil
    }
}

Sie haben zwei Optionen, die sich hinsichtlich Annäherung und Ergebnis recht ähnlich sind:

// 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;
1
Michael Dorner

Double() baut ein Double aus einem Int wie folgt auf:

var convertedDouble = Double(someInt)

Beachten Sie, dass dies nur funktioniert, wenn Ihr Text tatsächlich eine Nummer enthält. Da Wage ein Textfeld ist, kann der Benutzer eingeben, was immer er möchte, und dies löst einen Laufzeitfehler aus, wenn Sie das von toInt() zurückgegebene Feld "Optional" deaktivieren. Sie sollten überprüfen, ob die Konvertierung erfolgreich war, bevor Sie das Entpacken erzwingen.

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

Bearbeiten:

Wenn Sie sicher sind, dass es sich bei dem Text um eine Ganzzahl handelt, können Sie folgendermaßen vorgehen (beachten Sie, dass text in UITextField ebenfalls optional ist):

if let wageText = Wage.text {
    var wageFloat = Double(wageText.toInt()!)
}
1
Lance

Ich habe einen anderen Weg gefunden, um einen Eingabewert eines UITextFields in einen Float zu konvertieren:

    var tempString:String?
    var myFloat:Float?

    @IBAction func ButtonWasClicked(_ sender: Any) {
       tempString = myUITextField.text
       myFloat = Float(tempString!)!
    }
1
Wayne Lampiasi

In Swift 4

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

let floatVal  = (Totalname as NSString).floatValue //Now converted to float
0
Raghib Arshi

Der Vollständigkeit halber ist dies eine Lösung, die eine Erweiterung von UITextField verwendet, die auch ein anderes Gebietsschema berücksichtigen kann.

Für 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
    }
}
0
vadian

So bin ich darauf gekommen. Ich wollte nicht "die Brücke überqueren", da sie ohnehin aus Xcode 6 beta 5 entfernt wurde, schnell und schmutzig:

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