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 UITextfield
s, 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.
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.
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
).
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))
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"
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)"
}
}
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)
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.
import Foundation
"-23.67".floatValue // => -23.67
let s = "-23.67" as NSString
s.floatValue // => -23.67
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 !!!
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;
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()!)
}
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!)!
}
In Swift 4
let Totalname = "10.0" //Now it is in string
let floatVal = (Totalname as NSString).floatValue //Now converted to float
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
}
}
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")
}