web-dev-qa-db-fra.com

Lua - Comportement du nombre à la chaîne

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.

9
Virus721

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 float 2.0 sera imprimé comme 2.0 et non comme 2.) Vous devez toujours utiliser un format explicite lorsque vous avez besoin d’un format spécifique pour les nombres.

19
Yu Hao

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
2
codingbunny

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
1
user2262111

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
0
warspyking