Zahlen konvertieren
Willkommen in dieser Lektion über Zahlen konvertieren aus unserer Reihe “Swift lernen”.
In dieser Lektion beschäftigen wir uns mit der Konvertierung von Zahlen. Wie wir bereits in der Lektion über Zahlen gelernt haben gibt es Gleitkommazahlen und ganzwertige Zahlen. Bei der Kombination beider Typen kann es zu Fehlern bzw. zu Ungenauigkeiten kommen. Um dies zu vermeiden lernen wir Zahlen-Datentypen zu anderen Zahlen-Datentypen konvertieren zu können. Ausserdem lernen wir wie aus Zahlen-Datentypen Strings werden und wie man Strings in Integer- oder Double-Werte umwandelt.
Für diesen Teil gibt es auch ein Video Tutorial hier auf YouTube.
Gleitkommazahl konvertieren
1 2 3 |
var ganzzahl = 3 var gleitkommazahl = 0.14159 var zahlPi = Double(ganzzahl) + gleitkommazahl |
Wir sehen die Variablen „ganzzahl“ und „gleitkommazahl“ die als Integer und Double interpretiert werden. Versuchen wir nun diese beiden zu addieren erhalten wir von Xcode eine Fehlermeldung „Could not find an overload for „+“ that accepts the supplied arguments“ was grob gesagt bedeutet das Xcode nicht weiss wie es die beiden Argumente – in unserem Fall „ganzzahl“ und „gleitkommazahl“ – miteinander durch den „+“-Operator verknüpfen soll. Um diese Berechnung durchzuführen konvertieren wir den Integer „ganzzahl“ in einen Doublewert um. Dies erfolgt einfach indem wir den Variablennamen in runde Klammern vor das Wort „Double“ setzen.
Je nachdem welchen Datentypen wir verwenden müssen oder wollen können wir uns hier auch für einen Float entscheiden.
Probiert doch einmal aus was passiert wenn ihr „ganzzahl“ vor der Berechnung statt in einen Double in einen Float konvertiert.
Wir erhalten eine Fehlermeldung! Aber warum ist das so? Swift nimmt automatisch an das „gleitkommazahl“ ein Double-Wert ist, daher erhalten wir wieder die Fehlermeldung das wir unterschiedliche Datentypen miteinander addieren wollen.
Richtig könnte dies z.B. so aussehen
1 |
var zahlPi = Float(ganzzahl) + Float(gleitkommazahl) |
Wir konvertieren beide Variablen zu Float-Werten und können diese somit korrekt miteinander addieren, denn die Konvertierung findet vor der Rechenoperation statt.
Natürlich könnten wir auch von Anfang an die Variable zahlPi als Float deklarieren um uns Float(ganzzahl) zu sparen.
Ganzzahlen konvertieren
1 2 3 |
var ganzzahl = 3 var gleitkommazahl = 3.54 var ganztzahlergebnis = ganzzahl * Int(gleitkommazahl) |
In diesem Beispiel haben wir die Berechnung zwischen einer Ganzzahl und einer Gleitkommazahl. Wir möchten aber in unserem Ergebnis sicherstellen das wir einen Integer erhalten, weil wir dies z.B. in einer Schleife als Zähler verwenden wollen. Wie bei der Gleitkommazahl-Konvertierung müssen wir den Wert von dem wir wissen oder auch annehmen das er kein Integer ist, durch den Aufruf „Int(gleitkommazahl)“ vor der Berechnung in einen ganzahligen Wert konvertieren.
Zahlen in Strings konvertieren
Sie werden später sehr oft auf die Problematik treffen wie Sie Zahlen zu einem Strings konvertieren. Wir erhalten die selbe Problematik wie auch bei verschiedenen Zahlen-Datentypen, dass wir unterschiedliche Typen nicht miteinander verknüpfen können ohne diese korrekt zu konvertieren.
1 2 3 |
var ganzzahl = 42 var antwort = "Die Antwort auf alle Fragen lautet " antwort += String(ganzzahl) |
Nach dem selben Prinzip wie in den vorherigen Beispielen können wir durch ein String(Variablenname) Werte in den gewünschten Datentyp umwandeln. Man kann alternativ auch einfach die Zahl in den String mit der String Formatierung einfügen. Man sollte aber dennoch Wissen das man einen Int Problemlos zu einen String konvertieren kann ohne das man folgendes schreiben muss.
1 2 |
var meinInt = 12 var zahlString = "\(meinInt)" |
Strings in Zahlen konvertieren
Jetzt wird es das erste mal in Swift etwas seltsam, da wir das erste mal einen Optionalen Wert haben. Gut zu erkennen in Zeile 2, wo wir ein Ausrufezeichen am Ende der Zeilen haben. Der folgende Programmcode demonstriert wie wir einen String zu einer Zahl umwandeln können.
1 2 |
var zahlenString = "3" var zahl: Int = Int(zahlenString)! |
Wir rufen dabei den Konstruktor von Int auf, welcher einen String verarbeiten kann. Konstruktoren lernen wir später noch im Kapitel über Strukturen und Klassen kennen. Den Wert dieser Umwandlung weisen der Int-Variable zahl zu. Außerdem haben wir ein Ausrufezeichen hinter den Klammern. Was es mit dem Ausrufezeichen auf sich hat lernen wir in der Lektion über „Optionals“ kennen.
1 2 |
var gleitkommaString = "3.14159" var gleitkommazahl = Double(gleitkommaString) |
Für Gleitkommazahlen gilt das gleiche Prinzip wie bei Strings. Vor Swift 2 musste man hier noch auf die Objective-C Runtime zurückgreifen. Das ist zum Glück nicht mehr nötig.
Wie geht es weiter?
In der nächsten Lektion werden wir das Thema Type Aliases behandeln, mit denen es möglich ist alternative Namen für existierende Typen zu erstellen.
Ich hoffe Sie hatten Spass mit dieser Lektion. Bis zum nächsten mal!
18 Comments
Seit Beta5 wurde z.B. bridgeToObjectiveC() entfernt. Hier stehen noch mehr Änderungen welche im Tutorial verwendet werden: http://www.raywenderlich.com/79115/xcode6-beta5-swift-tutorial-updates
Wäre prima wenn die tollen Tutorials hier im swift-blog aktuell bleiben würden!
Hallo Birlie,
natürlich hast du Recht und wir sind auch immer stets darum bemüht alles up-to-date zu halten. Also Danke für deine Hinweis.
LG
– Ralf
Hallo,
was mache ich, wenn ich von einem Textfeld einen Typ String habe und möchte diesen in Float umwandeln?
Grüße
Florian
Hallo Flo,
ich habe dir hier zwei Möglichkeiten zusammen gefasst. Ich empfehle dir aber umbedingt einen Double statt eines Floats zu verwenden, da er wie du sehen wirst einen genaueren Wert konvertiert.
var textFeld = UITextField()
textFeld.text = „0.12“
var floatValue : Float = NSString(string: textFeld.text).floatValue
var doubleValue : Double = NSString(string: textFeld.text).doubleValue
println(floatValue) // -> 0.119999997317791
println(doubleValue) // -> 0.12
Ich hoffe ich konnte dir weiterhelfen.
Grüße
Ralf
bin gerade dabei eine kleine app zu programmieren.
hab also 3 textfelder.in zwei von denen möchte ich jeweils eine zahl eingeben
und in dem dritten textfeld soll die summe angezeigt werden,sobald ich auf dem entsprechenden button klicke.kreig das einfach nicht hin….
Email ist unterwegs 😉
vielen dank ….ihr seit die besten
hallo zusammen…bin einsteiger in der welt der programmierung,und wiel mit swift anfangen programmierung zu lernen..
nun möchte ich in ein textfeld ein wort eingeben und das programm soll dann den wert der buchstaben zusammenrechnen..denn jeder buchstabe soll sein eigenen wert haben den ich zuweisen werde.
z.b var H = 10 , var A = 25, var L = 30, var O = 50
wenn ich also im textfeld HALLO eingebe ,will ich in einem anderen texfeld die summe der buchstaben..in diesem fall 145!!!
wie komme ich im textfeld auf einen bestimmten buchstaben ??
und wie kreig ich das ganze hin????
kann mir jemand helfen..
danke !!!
Hi Stelios,
ich kenne mich mit Swift nicht so gut aus, aber ich denke es gibt sicherlich eine Trim oder Substring Methode, dann kannst du die einzelnen Zeichen auslesen und über ein If und else die gegebenen zahlen in variablen packen und am ende zusammen rechnen lassen.
Ich denke, dies sollte dein Problem lösen.
Hallo,
erst einmal ein Dankeschön für die tollen Tutorials! Im Zusammenhang mit der Konvertierung von Strings in Zahlen etc. stellt sich bei mir die Frage wie es denn mit den Punkten bzw. Kommas steht?
Im angelsächsischen wird der Punkt, bei uns das Komma verwendet. Wie kann ich z.B. ein UITextField programmieren, dass bei der Eingabe eines Kommas ein Punkt im Hintergrund umgewandelt wird? Oder spielt dies bei Swift keine Rolle, ob Punkt oder Komma gesetzt wird?
Danke für jegliche Hinweise!
Hallo!
Hierfür gibt es verschiedene Möglichkeiten. Im Normalfall wäre das wohl der NSNumberFormatter den man für die Darstellung nutzen sollte.
Das wäre sicherlich mal ein Video Tutorial Wert. Da könnte man das ganze Thema Internationalisierung/Lokalisierung dran nehmen.
Das wäre sicherlich ein guter Anwendungsfall den man als Beispiel hernehmen kann. Danke!
Hallo,
Bräuchte bitte eure Hilfe:
Ich habe 5 Reihen mit Jeweils 7 Textfelder
zB. 1.Reihe
A1, a2,a3,a4,a5,a6 und SummeA
2.Reihe
A2 und so weiter
Die Werte was man eingibt sind nur Zahlen! A1 bis a6 sollen addiert werden und die summe auf SummeA ausgegeben werden.
Wenn die Summe genau oder über 70 ist sollen 70 dazu addiert werden wenn 69 oder darunter einfach die summe ausgegeben werden. Bei reihe 2-4 sollen wenn 70 oder mehr nur 40 automatisch dazu kommen.
Könnt ihr mir da bitte helfen. Danke
Hallo Bippo,
leider im Moment nicht da ich gerade keine durch mein Privatleben keine Zeit habe. Vielleicht kann dir aber einer unsere User bis dahin eine Lösung posten in den Kommentaren.
Danke!
Var erstereihe = a1 + a2 +……..a6
If erstereihe >= 70 {
Var summe = erstereihe + 70
}
Mit der gleichenlogic können auch alle anderen reihen abgefragt werden und anders addiert werden.
Hoffe geholfen zuhaben!!
Hallo,
vielen dank für eure Hilfe.
Ich bin gerade erst dabei das ich mich da einlese in Swift (habe vorher noch garnix mit programmieren zu tun gehabt…)
swift-blog.de macht richtig gute Videos und auch sehr verständlich – TOP!
Ich kann googeln und youtube-vids suchen was ich will aber ich finde nicht wirklich eine HowTo wie ich zB das ganze dann mit einer „Tabelle“ dann auslesen kann wo eben der User was eingeben kann (ohne Button sondern alles gleich automatisch sobald die Felder befüllt werden.)
Wäre nett wenn mir da jemand mal kurz helfen könnte.
textfelder hab ich schon alle mal zum testen erstellt aber ich bin halt noch „unerfahren“ und kapiere nicht wie ich da den richtigen Code schreibe damit ich eben sage „was da eingegeben wird soll er auslesen und zusammenrechnen…“ wichtig ist halt ohne das ein Button gedrückt wird.
Vielen lieben Dank
Hallo bippo,
das ist leider das Problem von den meisten Tutorials. Wir haben hierfür bereits etwas in der Schublade 🙂
Mehr in den kommenden Tagen.
Danke für dein Feedback!
Hallo,
Bin gerade mit SWIFT am üben und bin hier auf einen Fehler gestossen. Seit Swift 2.0 Beta funktioniert diese Konvertierung bei mir nicht.
var zahlenString = „3“
var zString: Int = zahlenString.toInt()!
Vielen Dank.
Hi Giuseppe,
klasse, dass Du auch schon mit Swift 2 (beta) arbeitest.
Der String in Swift 2 bietet derzeit nicht mehr die toInt() Methode an.
Was sagst Du zu folgender Vorgehensweise?
var zahlenString = "3"
var zahlAlsInt = Int(zahlenString)
Bitte beachte, dass zahlAlsInt ein Optional ist, denn die Konvertierung kann schief gehen, sollte der String beispielsweise Buchstaben enthalten.