Typkoerzierung und Typkonvertierung
Lernen Sie die automatische Koerzierung zwischen Zeichenketten und Zahlen sowie die explizite Verwendung von tonumber/tostring kennen
Typkoerzierung und Typkonvertierung ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist Typzwang?
Typzwang ist die automatische Konvertierung eines Werts von einem Typ in einen anderen, wenn der Kontext dies erfordert. Lua führt den Typzwang in zwei bestimmten Richtungen durch: von String zu Zahl in arithmetischen Kontexten und von Zahl zu String in Konkatenationskontexten.
Anders als JavaScript ist der Typzwang in Lua begrenzt und vorhersehbar. Boolesche Werte werden nicht automatisch in Zahlen und Tabellen nicht automatisch in Strings umgewandelt.
-- String to number (arithmetic context)
print("10" + 5) -- 15 (coerced)
print("3.14" * 2) -- 6.28
-- Number to string (concatenation context)
print(10 .. "px") -- 10px
print(3.14 .. "!") -- 3.14!
-- No boolean coercion
-- print(true + 1) -- ERROR!Regeln für die Umwandlung von String zu Zahl
Wenn ein String in einem arithmetischen Ausdruck vorkommt, versucht Lua, ihn in eine Zahl umzuwandeln. Stellt der String keine gültige Zahl dar, wird ein Laufzeitfehler ausgelöst. Gültige numerische Strings sind unter anderem Ganzzahlen ("42"), Gleitkommazahlen ("3.14"), Hexadezimalzahlen ("0xff") und wissenschaftliche Schreibweise ("1e3").
Strings mit vorangestellten oder nachgestellten Leerzeichen werden akzeptiert – Lua entfernt diese bei der Typumwandlung.
print("42" + 0) -- 42 (integer)
print("3.14" + 0) -- 3.14 (float)
print("0xff" + 0) -- 255 (hex)
print(" 10 " + 0) -- 10 (whitespace ok)
print("1e3" + 0) -- 1000.0
-- This will error:
-- print("hello" + 0) -- attempt to perform arithmetic on a string valueUmwandlung von Zahl zu String
Wenn Sie eine Zahl mit .. verketten, wandelt Lua die Zahl automatisch in einen String um. Ganzzahlen werden in ihrer Dezimaldarstellung ausgegeben; bei Gleitkommazahlen können Dezimalstellen hinzukommen. Für eine präzise Kontrolle des Formats verwenden Sie immer tostring() oder string.format(), statt sich auf implizite Typumwandlung zu verlassen.
print(10 .. "!") -- 10!
print(3.14 .. "!") -- 3.14!
print(1/3 .. "!") -- 0.33333333333333!
-- Explicit is better for precision
print(string.format("%.2f", 1/3)) -- 0.33
print(tostring(10)) -- 10
print(tostring(10.0)) -- 10.0tonumber(): Explizite Konvertierung
tonumber(v) konvertiert einen Wert explizit in eine Zahl. Bei Erfolg gibt die Funktion die konvertierte Zahl zurück, bei einem Fehlschlag nil – sie löst niemals einen Fehler aus. Für die Interpretation von Ganzzahlen kann optional eine Basis (2–36) angegeben werden, wodurch Binär-, Oktal- und Hexadezimalkonvertierungen möglich sind.
Prüfen Sie beim Verarbeiten von Benutzereingaben immer, ob der Rückgabewert von tonumber() nil ist.
print(tonumber("42")) -- 42
print(tonumber("3.14")) -- 3.14
print(tonumber("0xFF")) -- 255
print(tonumber("hello")) -- nil (no error!)
print(tonumber(true)) -- nil
-- Base conversion
print(tonumber("ff", 16)) -- 255
print(tonumber("11", 2)) -- 3 (binary)
print(tonumber("77", 8)) -- 63 (octal)tostring(): Explizite Konvertierung
tostring(v) konvertiert jeden Wert in einen String. Für Zahlen erzeugt die Funktion einen String in Dezimaldarstellung oder wissenschaftlicher Schreibweise. Für boolesche Werte erzeugt sie "true" oder "false". Für nil gibt sie "nil" zurück. Für Tabellen und Funktionen gibt sie eine Adresse wie "table: 0x..." zurück, sofern keine __tostring-Metamethode definiert ist.
print(tostring(42)) -- 42
print(tostring(3.14)) -- 3.14
print(tostring(true)) -- true
print(tostring(false)) -- false
print(tostring(nil)) -- nil
print(tostring({})) -- table: 0x...
-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg) -- Value: nilmath.tointeger()
math.tointeger(x) (Lua 5.3+) konvertiert eine Gleitkommazahl nur dann in eine Ganzzahl, wenn der Wert exakt als Ganzzahl darstellbar ist. Würde die Konvertierung zu einem Präzisionsverlust führen, gibt die Funktion nil zurück. Dies ist sicherer als math.floor(), das immer erfolgreich ist, aber möglicherweise unbemerkt abschneidet.
Verwenden Sie diese Funktion, wenn Sie eine strikte Ganzzahlprüfung benötigen, beispielsweise bei der Anbindung an APIs, die exakte Ganzzahlen erfordern.
print(math.tointeger(5.0)) -- 5 (exact)
print(math.tointeger(5.5)) -- nil (not exact)
print(math.tointeger(2^53)) -- 9007199254740992
-- Contrast with math.floor
print(math.floor(5.9)) -- 5 (truncates)
print(math.floor(5.0)) -- 5
-- Check before use
local n = math.tointeger(val) or error("need integer")Typumwandlung bei Vergleichen
Lua führt bei Gleichheitsvergleichen keine Typumwandlung durch. 1 == "1" ist immer false, weil die Operanden unterschiedliche Typen haben. Relationale Operatoren (<, > usw.) lösen jedoch eine Umwandlung zwischen Strings und Zahlen aus – aber nur, wenn beide Operanden denselben Typ haben. Das Mischen von Typen bei Ordnungvergleichen führt zu einem Fehler.
print(1 == "1") -- false (no coercion)
print(1 == 1.0) -- true (int/float equal)
-- Ordering: same type only
print("abc" < "abd") -- true (string compare)
print(1 < 2) -- true (number compare)
-- This ERRORS: mixing string and number
-- print(1 < "2") -- attempt to compare number with stringPraxis: Benutzereingaben verarbeiten
Ein sehr häufiges Muster in Lua-Programmen besteht darin, einen String aus einer Benutzereingabe zu lesen (z. B. über io.read()) und ihn in eine Zahl umzuwandeln. Verwenden Sie immer tonumber() und prüfen Sie auf nil, um ungültige Eingaben ordnungsgemäß zu behandeln, anstatt das Programm abstürzen zu lassen.
-- Safe input parsing pattern
local function parseNumber(input)
local n = tonumber(input)
if n == nil then
return nil, "Invalid number: " .. tostring(input)
end
return n, nil
end
local val, err = parseNumber("42")
print(val, err) -- 42 nil
local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil Invalid number: abcFallstricke bei der Genauigkeit von Ganzzahlen und Gleitkommazahlen
Gleitkommazahlen haben eine begrenzte Genauigkeit. Operationen, die Ganzzahlen und Gleitkommazahlen mischen, können aufgrund der IEEE-754-Darstellung unerwartete Ergebnisse liefern. Die größte exakt als Double darstellbare Ganzzahl ist 2^53 = 9,007,199,254,740,992. Darüber liegende Ganzzahlen verlieren bei der Speicherung als Gleitkommazahl an Genauigkeit.
In Lua 5.3+ unterstützen native 64-Bit-Ganzzahlen exakte Werte bis zu 2^63-1 und damit deutlich größere Werte. Verwenden Sie Ganzzahlarithmetik, wenn es auf Exaktheit ankommt.
-- Float precision limit
print(2^53) -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)
-- Integer stays exact
local big = math.maxinteger
print(big) -- 9223372036854775807
print(math.type(big)) -- integer
-- Mixing promotes to float
print(math.type(1 + 1.0)) -- floatKonvertierung in String-Formate
string.format() ist das leistungsfähigste Werkzeug zur Konvertierung von Zahlen in Strings, wenn Sie Kontrolle über Genauigkeit, Auffüllung und Schreibweise benötigen. Die Funktion verwendet die Formatbezeichner von C-printf. Verwenden Sie sie für die Anzeige, die Dateiausgabe und überall dort, wo die standardmäßige Darstellung von tostring() nicht ausreicht.
print(string.format("%d", 255)) -- 255
print(string.format("%x", 255)) -- ff
print(string.format("%05d", 42)) -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0)) -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10Kurztest
Was gibt tonumber("hello") in Lua zurück?
Rückblick: Typzwang und Konvertierung
Das haben Sie gelernt:
- Lua wandelt Strings in arithmetischen Ausdrücken automatisch in Zahlen und Zahlen bei der Konkatenation in Strings um
tonumber()gibt bei einem Fehlschlag nil zurück – prüfen Sie den Rückgabewert immer!tostring()konvertiert jeden Wert sicher in einen String- Die Gleichheit (
==) führt niemals eine Typumwandlung durch – Werte unterschiedlichen Typs sind nie gleich - Verwenden Sie
string.format()für eine präzise Zahlenformatierung - Die Genauigkeitsgrenze von Gleitkommazahlen liegt bei 2^53; verwenden Sie für große exakte Werte native Ganzzahlen
Als Nächstes: Kontrollfluss mit if/elseif/else und Schleifen.
Häufig gestellte Fragen
Ist die Lektion „Typkoerzierung und Typkonvertierung“ kostenlos?
Ja — der vollständige Text von „Typkoerzierung und Typkonvertierung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Typkoerzierung und Typkonvertierung“?
Lernen Sie die automatische Koerzierung zwischen Zeichenketten und Zahlen sowie die explizite Verwendung von tonumber/tostring kennen Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Typkoerzierung und Typkonvertierung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Überblick über Lua-Datentypen
- Variablen in Lua deklarieren
- Arithmetische und relationale Operatoren
- Typkoerzierung und Typkonvertierung