virus721
Me gustaría saber cómo maneja Lua las conversiones de número a cadena usando el tostring()
función.
Se va a convertir a un int (como una cadena) si el número es redondo (es decir, si number == (int) number
) o siempre va a generar una salida real (como una cadena) como 10.0
?
Necesito imitar el comportamiento exacto de Lua tostring
en C, sin usar la API de Lua C ya que, en este caso, no estoy usando un lua_State
.
En Lua 5.2 o anterior, ambos tostring(10)
y tostring(10.0)
resultado como la cadena "10"
.
En Lua 5.3, esto ha cambiado:
print(tostring(10)) -- "10"
print(tostring(10.0)) -- "10.0"
Eso es porque Lua 5.3 introdujo el subtipo entero. De Cambios en el idioma:
La conversión de un flotante a una cadena ahora agrega un
.0
sufijo al resultado si parece un número entero. (Por ejemplo, el flotador2.0
se imprimirá como2.0
no como2
.) Siempre debe usar un formato explícito cuando necesite un formato específico para los números.
-
Gracias por tu ayuda. Así que no es tan fácil como esperaba. Estoy usando 5.3.2 y no planeo usar otra versión.
– Virus721
16 de marzo de 2016 a las 9:38
codificando conejito
Lua convierte los números tal cual:
print(tostring(10)) => "10"
print(tostring(10.0)) => "10.0"
print(tostring(10.1)) => "10.1"
Si quieres jugar con ellos, hay un pequeño analizador en línea para comandos simples como este: http://www.lua.org/cgi-bin/demo
Esto usa Lua 5.3.1
editar
Debo apoyar el comentario de Egor, depende de la versión. Ejecuté esto localmente en mi sistema:
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print(tostring(10))
10
> print(tostring(10.0))
10
-
Gracias intentaré esto. ¿No hay una documentación oficial sobre la función tostring de lua? He estado buscando pero la información es muy escasa y tienes que leer el libro completo cada vez que quieras un poco de información…
– Virus721
16 de marzo de 2016 a las 9:21
-
todo lo que pude encontrar fue lua.org/pil/2.4.html y lua.org/manual/5.1/manual.html#lua_tostring
– conejito codificador
16 de marzo de 2016 a las 9:23
-
Bueno, como sospechaba, si número == (int) número, imprime un int. No puedo creer que no haya documentación oficial de estas funciones básicas. De todas formas, gracias por la ayuda.
– Virus721
16 de marzo de 2016 a las 9:25
usuario2262111
Si está utilizando 5.3.4 y necesita una revisión rápida, use math.floor, lo convierte en un número int. Esto supera a la respuesta de @warspyking en eficiencia, pero carece de la frialdad que es un montón de código.
>tostring(math.floor(54.0))
54
>tostring(54.0)
54.0
>type(math.floor(54.0))
integer
>type(54.0)
number
En Lua 5.3, debido al tipo entero, tostring
en un flotante (aunque su valor numérico puede ser equivalente a un número entero) agregará un "'.0'
sufijo, ¡pero eso no significa que no puedas acortarlo!
local str = tostring(n)
if str:sub(-2) == ".0" then
str = str:sub(1,-3)
end
Depende de la versión de Lua.
– Egor Skriptunoff
16 de marzo de 2016 a las 9:20