Werte umwandeln
Eine Zahl kann sich auch in einem Text verstecken: "12" in Anführungszeichen ist nicht die Zahl 12, sondern ein Text aus den Zeichen 1 und 2. Programme bekommen Zahlen ständig als Texte: was jemand auf der Tastatur eingegeben hat, eine Zeile aus einer Datei, ein Preis auf einem Zettel. Und print zeigt beides gleich an, du erkennst den Unterschied also nicht auf den ersten Blick:
local eier = 12
local notiz = "12"
print(eier, notiz)
print(type(eier), type(notiz))Das gibt Folgendes aus:
12 12
number stringDie Funktion tonumber wandelt einen Text in eine Zahl um. Wenn der Text keine Zahl ist, liefert sie nil:
print(tonumber("12"))
print(tonumber("2.5"))
print(tonumber(" 7 "))
print(tonumber("12 Eier"))
print(tonumber("2,5"))Das gibt Folgendes aus:
12
2.5
7
nil
nilLeerzeichen um die Zahl spielen keine Rolle, aber alles andere im Text schon, sogar ein Dezimalkomma. Weil das Ergebnis nil sein kann, ist es sinnvoll, es zu prüfen; wie, lernst du in der Lektion über Bedingungen.
Die Funktion tostring arbeitet andersherum: Sie wandelt jeden Wert in einen Text um. Du brauchst sie, wenn du einen Wahrheitswert oder nil mit .. an einen Text hängen willst:
local scheuneOffen = true
print("Scheune offen: " .. tostring(scheuneOffen))
print("Kürbisse: " .. tostring(nil))Das gibt Folgendes aus:
Scheune offen: true
Kürbisse: nilZahlen brauchen sie nicht: .. macht sie von selbst zu Text, wie in "Münzen: " .. 120.
Lua kann einen Text auch von selbst in eine Zahl umwandeln, wenn du damit rechnest:
print("10" + 5)
print("10" * "2")
print("10" .. 5)Das gibt Folgendes aus:
15
20
105Die letzte Zeile rechnet nicht: .. verbindet immer, deshalb ergeben "10" und 5 den Text 105. Verlasse dich nicht auf diese Umwandlungen. Ein solches Programm funktioniert nur, solange der Text wirklich eine Zahl ist: "zehn" + 5 hält das Programm mit dem Fehler attempt to add a 'string' with a 'number' an. Und Vergleiche, die du in der nächsten Lektion lernst, wandeln gar nicht um. Mit tonumber zeigt der Code deutlich, dass eine Umwandlung stattfindet, und du bekommst nil statt eines Fehlers, den du prüfen kannst.
So schreibst du es:
Anweisungen
- 1
Wandle
karottenVerkauftundkarottenPreismittonumberin Zahlen um, multipliziere sie und gib aus, wie viel Emma mit den Karotten verdient hat:Karotten: 60 Münzen - 2
Gib in der nächsten Zeile aus, ob Emma alles verkauft hat. Verbinde den Wert von
ausverkauftmit..mit dem Text; er ist ein Wahrheitswert, du brauchst alsotostring:Karotten: 60 Münzen Ausverkauft: true - 3
Bei den Kürbissen hat Emma „etwa 3“ notiert, was keine Zahl ist. Gib aus, was
tonumberauskuerbisseVerkauftmacht, nach dem Text"Kürbisse:"und einem Komma:Karotten: 60 Münzen Ausverkauft: true Kürbisse: nil