Je voudrais savoir comment Lua gère le nombre de conversions de chaînes à l'aide de la fonction tostring()
.
Il sera converti en un entier (en tant que chaîne) si le nombre est rond (c'est-à-dire si number == (int) number
) ou est-il toujours destiné à générer un réel (en tant que chaîne) comme 10.0
?
Je dois imiter le comportement exact de la tostring
en C de Lua, sans utiliser l'API C de Lua car, dans ce cas, je n'utilise pas de lua_State
.
Dans Lua 5.2 ou version antérieure, tostring(10)
et tostring(10.0)
résultent en chaîne "10"
.
Dans Lua 5.3, cela a changé:
print(tostring(10)) -- "10"
print(tostring(10.0)) -- "10.0"
En effet, Lua 5.3 a introduit le sous-type entier. De Changements de langue :
La conversion d'un float en chaîne ajoute désormais un suffixe
.0
au résultat s'il ressemble à un entier. (Par exemple, le float2.0
sera imprimé comme2.0
et non comme2
.) Vous devez toujours utiliser un format explicite lorsque vous avez besoin d’un format spécifique pour les nombres.
Lua convertit les nombres tels quels:
print(tostring(10)) => "10"
print(tostring(10.0)) => "10.0"
print(tostring(10.1)) => "10.1"
Si vous voulez jouer avec eux, il existe un petit analyseur en ligne pour les commandes simples telles que: http://www.lua.org/cgi-bin/demo Ceci utilise Lua 5.3.1.
edit Je dois supporter le commentaire d'Egor, il dépend de la version . Je l'ai exécuté localement sur mon système:
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print(tostring(10))
10
> print(tostring(10.0))
10
Si vous utilisez 5.3.4 et que vous avez besoin d'un correctif rapide, utilisez math.floor - il le convertit en un numéro international. Cela dépasse l'efficacité de warspyking, mais manque de fraîcheur, c'est-à-dire des grappes de code.
>tostring(math.floor(54.0))
54
>tostring(54.0)
54.0
Dans Lua 5.3, en raison du type entier, tostring
sur un float (bien que sa valeur numérique puisse être équivalente à un entier) ajoutera un suffixe "'.0'
, mais cela ne signifie pas que vous ne pouvez pas le raccourcir!
local str = tostring(n)
if str:sub(-2) == ".0" then
str = str:sub(1,-3)
end