Преобразование 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"
}
вы можете использовать тот же подход для других вычислений, надейтесь на эту помощь!