Coercition et conversion de types
Découvrez la coercition automatique entre chaînes et nombres, ainsi que tonumber/tostring explicites.
Coercition et conversion de types est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.
Qu’est-ce que la conversion implicite des types ?
La conversion implicite des types est la conversion automatique d’une valeur d’un type vers un autre lorsque le contexte l’exige. Lua effectue cette conversion dans deux directions précises : de chaîne vers nombre dans les contextes arithmétiques, et de nombre vers chaîne dans les contextes de concaténation.
Contrairement à JavaScript, la conversion implicite de Lua est limitée et prévisible. Lua ne convertit pas automatiquement les booléens en nombres ni les tables en chaînes.
-- 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!Règles de conversion de chaîne vers nombre
Lorsqu’une chaîne apparaît dans une expression arithmétique, Lua essaie de la convertir en nombre. Si la chaîne ne représente pas un nombre valide, une erreur d’exécution est générée. Les chaînes numériques valides comprennent les entiers ("42"), les nombres flottants ("3.14"), les nombres hexadécimaux ("0xff") et la notation scientifique ("1e3").
Les chaînes comportant des espaces au début ou à la fin sont acceptées : Lua les supprime lors de la conversion implicite.
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 valueConversion de nombre vers chaîne
Lorsque vous concaténez un nombre avec .., Lua convertit automatiquement ce nombre en chaîne. Les entiers prennent leur représentation décimale ; les nombres flottants peuvent comporter des décimales. Pour contrôler précisément le format, utilisez toujours tostring() ou string.format() plutôt que de vous fier à une conversion implicite.
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() : conversion explicite
tonumber(v) convertit explicitement une valeur en nombre. En cas de réussite, la fonction renvoie le nombre converti ; si la conversion échoue, elle renvoie nil et ne génère jamais d’erreur. Vous pouvez spécifier une base facultative (de 2 à 36) pour analyser des entiers, ce qui permet les conversions binaires, octales et hexadécimales.
Vérifiez toujours que la valeur renvoyée par tonumber() n’est pas nil lorsque vous traitez une saisie utilisateur.
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() : conversion explicite
tostring(v) convertit n’importe quelle valeur en chaîne. Pour les nombres, la fonction produit une chaîne en notation décimale ou scientifique. Pour les booléens, elle produit "true" ou "false". Pour nil, elle renvoie "nil". Pour les tables et les fonctions, elle renvoie une adresse telle que "table: 0x...", sauf si une méthode de métatable __tostring est définie.
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 ou version ultérieure) convertit un nombre flottant en entier uniquement si sa valeur possède une représentation entière exacte. Si la conversion entraîne une perte de précision, la fonction renvoie nil. Cette fonction est plus sûre que math.floor(), qui réussit toujours mais peut tronquer silencieusement la valeur.
Utilisez-la lorsque vous avez besoin d’une validation stricte des entiers, par exemple pour utiliser des API qui exigent des entiers exacts.
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")Conversion implicite dans les comparaisons
Lua n’effectue pas de conversion implicite des types pour les comparaisons d’égalité. 1 == "1" vaut toujours false, car les opérandes sont de types différents. En revanche, les opérateurs relationnels (<, >, etc.) déclenchent une conversion entre chaînes et nombres, mais uniquement si les deux opérandes sont du même type. Le mélange de types dans les comparaisons d’ordre génère une erreur.
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 stringEn pratique : analyser une saisie utilisateur
Dans les programmes Lua, il est très courant de lire une chaîne provenant d’une saisie utilisateur (par exemple avec io.read()), puis de la convertir en nombre. Utilisez toujours tonumber() et vérifiez que le résultat n’est pas nil afin de gérer correctement une saisie invalide plutôt que de provoquer un plantage.
-- 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: abcPièges liés à la précision des entiers et des nombres flottants
Les nombres flottants ont une précision limitée. Les opérations qui mélangent entiers et nombres flottants peuvent produire des résultats inattendus en raison de la représentation IEEE 754. Le plus grand entier représentable exactement sous forme de nombre double est 2^53 = 9,007,199,254,740,992. Les entiers au-delà de cette valeur perdent de la précision lorsqu’ils sont stockés comme nombres flottants.
Dans Lua 5.3 ou version ultérieure, les entiers natifs sur 64 bits prennent en charge exactement des valeurs allant jusqu’à 2^63-1, ce qui est beaucoup plus grand. Utilisez toujours l’arithmétique entière lorsque l’exactitude est importante.
-- 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)) -- floatConversions avec formatage de chaînes
string.format() est l’outil le plus puissant pour convertir des nombres en chaînes lorsque vous devez contrôler la précision, le remplissage et la notation. Il suit les spécificateurs de format de printf du langage C. Utilisez-le pour l’affichage, la sortie vers un fichier et partout où la représentation par défaut de tostring() ne suffit pas.
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=10Vérification rapide
Que renvoie tonumber("hello") en Lua ?
Récapitulatif : conversion implicite et conversion explicite des types
Ce que vous avez appris :
- Lua convertit implicitement les chaînes en nombres dans les opérations arithmétiques, et les nombres en chaînes lors de la concaténation
tonumber()renvoie nil en cas d’échec : vérifiez toujours le résultat !tostring()convertit toute valeur en chaîne en toute sécurité- L’égalité (
==) n’effectue jamais de conversion implicite : des types différents ne sont jamais égaux - Utilisez
string.format()pour formater précisément les nombres - La limite de précision des nombres flottants est 2^53 ; utilisez des entiers natifs pour les grandes valeurs exactes
Ensuite : contrôle du flux avec if/elseif/else et les boucles.
Questions Fréquemment Posées
La leçon « Coercition et conversion de types » est-elle gratuite ?
Oui — le texte complet de « Coercition et conversion de types » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Coercition et conversion de types » ?
Découvrez la coercition automatique entre chaînes et nombres, ainsi que tonumber/tostring explicites. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Lua Academy ?
Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Coercition et conversion de types » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?
Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Présentation des types de données Lua
- Déclarer des variables en Lua
- Opérateurs arithmétiques et relationnels
- Coercition et conversion de types