Próbuję przekonwertować liczby pobrane z UITextField, które, jak przypuszczam, są w rzeczywistości ciągami, i przekonwertować je na zmiennoprzecinkowe, aby móc je pomnożyć.
Mam dwa, UITextfield
które są zadeklarowane w następujący sposób:
@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
Kiedy użytkownik naciska przycisk UIButton, chcę obliczyć zarobki, które zarabia użytkownik, ale nie mogę, ponieważ najpierw muszę je przekonwertować na zmienne, zanim będę mógł z nich korzystać.
Wiem, jak przekonwertować je na liczbę całkowitą, wykonując następujące czynności:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
Jednak nie mam pojęcia, jak przekonwertować je na elementy pływające.
źródło
NSString
mafloatValue
rozszerzenie, ale goString
nie ma. Uzyskaj błąd:'String' does not have member named floatValue
let floatValue = (Float)(Wage.text)
... W Swift 2.0Ponieważ na przykład w niektórych częściach świata zamiast przecinka używany jest przecinek. Najlepiej jest utworzyć NSNumberFormatter, aby przekonwertować ciąg na zmiennoprzecinkowy.
źródło
Konwertuję String na Float w ten sposób:
źródło
NSString.floatValue
, które po prostu zwracają,0
jeśli coś jest nie tak). Zauważ, żeNSNumberFormatter
zostało to zmienioneNumberFormatter
.Aktualizacja
Zaakceptowana odpowiedź wskazuje na bardziej aktualny sposób postępowania
Szybki 1
Oto jak Paul Hegarty pokazał się na zajęciach CS193p na Uniwersytecie Stanforda w 2015 roku:
Możesz nawet utworzyć obliczoną właściwość, aby nie musieć tego robić za każdym razem
źródło
Korzystając z przyjętego rozwiązania, stwierdziłem, że moja „1.1” (przy użyciu konwersji .floatValue) zostanie przekonwertowana na 1,10000002384186, co nie było tym, czego chciałem. Jednak gdybym zamiast tego użył .doubleValue, uzyskałbym 1.1, którego chciałem.
Na przykład zamiast korzystać z zaakceptowanego rozwiązania, użyłem tego:
W moim przypadku nie potrzebowałem podwójnej precyzji, ale użycie .floatValue nie dawało mi właściwego wyniku.
Chciałem tylko dodać to do dyskusji na wypadek, gdyby ktoś inny napotkał ten sam problem.
źródło
Poniżej znajdziesz opcjonalny spławik, przyklej! na końcu, jeśli wiesz, że to Float, lub użyj if / let.
źródło
Oto adaptacja Swift 3 rozwiązania Paula Hegarty'ego z odpowiedzi rdprado, z pewnymi sprawdzeniami dodanymi do niej opcjami (zwracanie 0,0, jeśli jakakolwiek część procesu się nie powiedzie):
Nawiasem mówiąc, wziąłem udział w zajęciach CS193p na Uniwersytecie Stanforda na Uniwersytecie iTunes, kiedy jeszcze nauczał Objective-C.
Uważam, że Paul Hegarty jest FANTASTYCZNYM instruktorem i gorąco polecam tę klasę każdemu, kto zaczyna jako programista iOS w Swift !!!
źródło
NumberFormatter
znaku, aby radzić sobie z liczbami zmiennoprzecinkowymi wprowadzonymi przez użytkownika.źródło
Szybko 4
źródło
źródło
return Float(self)
?Masz dwie opcje, które są dość podobne (pod względem podejścia i wyniku):
źródło
Double()
buduje Double z Int, na przykład:var convertedDouble = Double(someInt)
Zauważ, że zadziała to tylko wtedy, gdy twój tekst faktycznie zawiera liczbę. Ponieważ
Wage
jest to pole tekstowe, użytkownik może wprowadzić cokolwiek zechce, a to spowoduje błąd w czasie wykonywania, gdy przejdziesz do rozpakowania opcjonalnego zwróconego ztoInt()
. Powinieneś sprawdzić, czy konwersja powiodła się przed wymuszeniem rozpakowania.Edytować:
Jeśli masz pewność, że tekst będzie liczbą całkowitą, możesz zrobić coś takiego (zwróć uwagę, że
text
w UITextField jest również opcjonalne):źródło
wageConversionFloat
nigdy nie będzie zmiennoprzecinkową, ulega awarii bezpośrednio, jeśli ciąg wejściowy jest czymś w rodzaju zmiennej zmiennoprzecinkowej234.56
. jak mogłoby to być zaakceptowane / przegłosowane rozwiązanie ...?3
jeśli pole tekstowe ma3.5
. Dzieje się tak, ponieważ tekst jest najpierw konwertowany na format anInt
, a następnieInt
konwertowany na formatFloat
.Znalazłem inny sposób, aby pobrać wartość wejściową UITextField i rzutować ją na float:
źródło
możesz użyć,
Jeśli chcesz zaokrąglić liczbę zmiennoprzecinkową do 2 miejsc po przecinku:
źródło
Tak do tego doszedłem. Nie chciałem "przechodzić przez most", ponieważ i tak został usunięty z Xcode 6 beta 5, szybko i brudno:
źródło
toDouble()
funkcji z ciągiem „10” Mam na myśli, jeśli nie ma miejsca po przecinku. I tak się rozbije. Ponieważ w tym przypadku liczba wyniesie 1 i nie zajmujesz się tym. Rozbije się oelse if comps[0] == "" || comps[1] == ""
. W każdym razie jesteś tak poważny w nawróceniu.W trosce o kompletność jest to rozwiązanie wykorzystujące rozszerzenie,
UITextField
które może również uwzględniać inne lokalizacje.Dla Swift 3+
źródło
Float?
a nie traktować niepoprawnych wartości jako0.0
. Pozwól dzwoniącemu zrobić coś takiegolet val = field.floatValue ?? 0.0
, jak gdyby dany przypadek traktował zły wynik jako zero.Swift 4/5, użyj tylko Float (wartość).
Odpowiedź: 123200
źródło
Użyj tego:
źródło
Łatwy sposób:
możesz użyć tego samego podejścia do innych obliczeń, mam nadzieję, że to pomoże!
źródło
float