Konvertiere String um in Apples Swift zu schweben

Ich versuche Zahlen aus einem UITextField zu konvertieren, die, wie ich vermute, tatsächlich Strings sind, und sie in Float umwandeln, damit ich sie multiplizieren kann.

Ich habe zwei UITextfield s, die wie folgt deklariert sind:

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

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

Ich weiß, wie man sie in eine ganze Zahl umwandelt, indem man

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

Ich habe jedoch keine Ahnung, wie man sie in Floats umwandelt.

   

Swift 2.0+

Jetzt mit Swift 2.0 können Sie einfach Float(Wage.text) die einen Float? zurückgibt Float? Art. Klarer als die folgende Lösung, die einfach 0 zurückgibt.

Wenn Sie aus irgendeinem Grund einen Wert von 0 für ein ungültiges Float möchten, können Sie Float(Wage.text) ?? 0 Float(Wage.text) ?? 0 die 0 wenn es kein gültiger Float .


Alte Lösung

Der beste Weg, dies zu bewältigen, ist das direkte Gießen:

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

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

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

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

Dies ist eine gute Implementierung, da sie tatsächliche Gleitkommazahlen verarbeiten kann (Eingabe mit . ) Und außerdem dazu 12p.34 , dass der Benutzer 12p.34 Text in Ihr Eingabefeld kopiert ( 12p.34 oder sogar 12.12.41 ).

Offensichtlich, wenn Apple Swift einen floatValue hinzufügt, wird dies eine Ausnahme floatValue , aber es kann in der Zwischenzeit nett sein. Wenn sie es später hinzufügen, müssen Sie nur die Erweiterung entfernen und alles funktioniert nahtlos, da Sie bereits .floatValue aufrufen!

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

Weil in einigen Teilen der Welt beispielsweise ein Komma anstelle einer Dezimalzahl verwendet wird. 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)) 

Ich konvertiere String auf Float:

 let numberFormatter = NSNumberFormatter() let number = numberFormatter.numberFromString("15.5") let numberFloatValue = number.floatValue println("number is \(numberFloatValue)") // prints "number is 15.5" 

Aktualisieren

Die akzeptierte Antwort zeigt eine aktuellere Vorgehensweise

Schnell 1

So hat Paul Hegarty 2015 in der CS193p-class von Stanford gezeigt:

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

Sie können sogar eine berechnete Eigenschaft erstellen, um dies nicht jedes Mal durchführen zu müssen

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

Unter Verwendung der akzeptierten Lösung stellte ich fest, dass mein “1.1” (bei Verwendung der .floatValue-Konvertierung) in 1.10000002384186 konvertiert würde, was nicht das war, was ich wollte. Wenn ich stattdessen jedoch den .doubleValue-Wert verwende, würde ich die 1.1, die ich wollte, bekommen.

Anstatt beispielsweise die akzeptierte Lösung zu verwenden, habe ich stattdessen Folgendes verwendet:

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

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

Ich wollte das nur zur Diskussion hinzufügen, falls jemand anderes auf dasselbe Problem gestoßen wäre.

Im Folgenden erhalten Sie ein optionales Float, kleben Sie ein! Am Ende, wenn Sie wissen, dass es ein Float ist, oder verwenden Sie wenn / lassen.

 let wageConversion = Float(wage.text) 
 import Foundation "-23.67".floatValue // => -23.67 let s = "-23.67" as NSString s.floatValue // => -23.67 

Hier ist eine schnelle Anpassung von Paul Hegartys Lösung von rdprados Antwort, wobei einige nach zusätzlichen Optionen gesucht werden (die 0.0 zurückgibt, wenn ein Teil des processes fehlschlägt):

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

Übrigens, ich nahm Stanfords CS193p-class mit der iTunes University, als sie noch Objective-C unterrichtete.

Ich fand Paul Hegarty als FANTASTIC Instructor, und ich würde die class jedem empfehlen, der als iOS Entwickler in Swift anfing !!!

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

Sie haben zwei Optionen, die einander sehr ähnlich sind (nach Ansatz und Ergebnis):

 // 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() ein Double von einem Int wie folgt:

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 er will, und dies wird einen Laufzeiterrors auslösen, wenn Sie das optionale von toInt() Optionale toInt() . Sie sollten überprüfen, ob die Konvertierung erfolgreich war, bevor Sie das Unboxing 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 der Text eine Ganzzahl ist, können Sie so etwas tun (beachten Sie, dass text auf UITextField auch optional ist)):

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

So habe ich es angegangen. Ich wollte nicht “über die Brücke” gehen, da es von Xcode 6 beta 5 sowieso schnell und dreckig entfernt wurde:

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

Der Vollständigkeit halber ist dies eine Lösung, die eine Erweiterung von UITextField 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 } } 

Benutze das:

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

Einfacher Weg:

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

Sie können den gleichen Ansatz für andere Berechnungen verwenden, hoffe diese Hilfe !!