Преобразование String для плавания в Apple Swift

Я пытаюсь преобразовать числа, взятые из UITextField, которые, как я полагаю, на самом деле являются строками и конвертировать их в float, поэтому я могу их умножить.

У меня есть два UITextfield, которые объявляются следующим образом:

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

Когда пользователь нажимает на UIButton, я хочу рассчитать заработную плату, которую пользователь зарабатывает, но я не могу, поскольку мне нужно сначала преобразовать их в float, прежде чем я смогу их использовать.

Я знаю, как преобразовать их в целое число, выполнив следующие действия:

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

Однако я не знаю, как преобразовать их в float.

Ответ 1

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 или даже 12.12.41).

Очевидно, что если Apple добавит floatValue в Swift, это вызовет исключение, но может быть приятно в среднем. Если они добавят его позже, то все, что вам нужно сделать, чтобы изменить код, - это удалить расширение, и все будет работать без сбоев, так как вы уже будете звонить .floatValue!

Кроме того, переменные и константы должны начинаться с нижнего регистра (включая IBOutlets)

Ответ 2

Потому что в некоторых частях мира, например, вместо десятичной запятой используется запятая. Лучше всего создать NSNumberFormatter для преобразования строки в float.

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

Ответ 3

Я преобразовываю String в Float следующим образом:

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

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

Ответ 4

Обновление

Принятый ответ показывает более современный способ выполнения

Swift 1

Вот как Павел Гегарти показал в классе Stanford CS193p в 2015 году:

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

Вы даже можете создать вычисляемое свойство, чтобы не делать этого каждый раз

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

Ответ 5

Используя принятое решение, я обнаружил, что мой "1.1" (при использовании преобразования .floatValue) будет преобразован в 1.10000002384186, чего я не хотел. Однако, если бы я использовал .doubleValue, я бы получил 1,1, который я хотел.

Так, например, вместо использования принятого решения я использовал это вместо:

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

В моем случае мне не нужна двойная точность, но использование .floatValue не дало мне правильного результата.

Просто хотел добавить это к обсуждению, если кто-то другой столкнулся с той же проблемой.

Ответ 6

Ниже вы получите опциональный Float, придерживайтесь! в конце, если вы знаете, что это Float, или используйте if/let.

let wageConversion = Float(wage.text)

Ответ 7

import Foundation
"-23.67".floatValue // => -23.67

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

Ответ 8

extension String {    
    func floatValue() -> Float? {
        return Float(self)
    }
}

Ответ 9

Вот адаптация Swift 3 решения Paul Hegarty из ответа rdprado, с некоторыми проверками на добавочные дополнительные опции (возврат 0.0, если какая-либо часть процесса завершилась с ошибкой):

var wageFloat:Float = 0.0

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

Кстати, я взял класс Stanford CS193p, используя ITunes University, когда он еще преподавал Objective-C.

Я обнаружил, что Пол Хегарти был инструктором FANTASTIC, и я очень рекомендую класс всем, кто начнет работу в качестве разработчика iOS в Swift!!!

Ответ 10

Свифт 4

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

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

Ответ 11

Double() строит Double из Int, например:

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

Edit:

Если вы уверены, что текст будет целым, вы можете сделать что-то вроде этого (обратите внимание, что text в UITextField также необязательно)):

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

Ответ 12

У вас есть два варианта, которые очень похожи (по подходу и результату):

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

Ответ 13

Я нашел другой способ взять входное значение UITextField и привести его к float:

    var tempString:String?
    var myFloat:Float?

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

Ответ 14

Вот как я подошел к нему. Я не хотел "пересекать мост", так как он был удален из 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")
}

Ответ 15

Для полноты картины это решение, использующее расширение 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
    }
}

Ответ 16

Swift 4/5, используйте только Float (значение).

let string_value : String = "123200"

let float_value : Float = Float(string_value)

print(float_value)

Ответ: 123200

Ответ 17

Используйте это:

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

Ответ 18

Простой способ:

// toInt returns optional that 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"
}

вы можете использовать тот же подход для других вычислений, надейтесь на эту помощь!