¿Cómo puedo convertir una cadena en un entero en Lua?
Tengo una cadena como esta:
a = "10"
Me gustaría que se convirtiera a 10, el número.
¿Cómo puedo convertir una cadena en un entero en Lua?
Tengo una cadena como esta:
a = "10"
Me gustaría que se convirtiera a 10, el número.
Respuestas:
Usa la tonumber
función . Al igual que en a = tonumber("10")
.
Puede forzar una conversión implícita usando una cadena en una operación aritmética como en a= "10" + 0
, pero esto no es tan claro o tan limpio como usarlo tonumber
explícitamente.
tonumber
¡Sin embargo, la falta de claridad es una razón más para usar en su lugar!)
+
siempre es explícitamente suma, ..
- concatenación.
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))
Salida
string
number
Todos los números en Lua son flotantes ( editar: Lua 5.2 o menos). Si realmente desea convertir a un "int" (o al menos replicar este comportamiento), puede hacer esto:
local function ToInteger(number)
return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'"))
end
En ese caso, convierte explícitamente la cadena (o realmente, lo que sea) en un número, y luego trunca el número como lo haría una conversión (int) en Java.
Editar: Esto todavía funciona en Lua 5.3, incluso aunque Lua 5.3 tenga enteros reales, ya que math.floor()
devuelve un entero, mientras que un operador como number // 1
todavía devolverá un flotante si number
es flotante.
digamos que la cadena que quieres convertir en un número está en la variable S
a=tonumber(S)
siempre que haya números y solo números en S
él, devolverá un número, pero si hay caracteres que no son números (excepto los períodos para flotantes), devolverá cero
La opción más clara es usar tonumber .
A partir de 5.3.2, esta función detectará automáticamente enteros (con signo), flotantes (si hay un punto) y hexadecimales (tanto enteros como flotantes, si la cadena comienza por "0x" o "0X").
Los siguientes fragmentos son más cortos pero no equivalentes:
a + 0 -- forces the conversion into float, due to how + works.
a | 0 -- (| is the bitwise or) forces the conversion into integer.
-- However, unlike `math.tointeger`, it errors if it fails.
Cabe señalar que math.floor()
siempre se redondea hacia abajo y, por lo tanto, no produce un resultado sensible para valores negativos de coma flotante.
Por ejemplo, -10.4 representado como un entero normalmente se truncaría o se redondearía a -10. Sin embargo, el resultado de math.floor () no es el mismo:
math.floor(-10.4) => -11
Para el truncamiento con conversión de tipo, funcionará la siguiente función auxiliar:
function tointeger( x )
num = tonumber( x )
return num < 0 and math.ceil( num ) or math.floor( num )
end
Referencia: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
Puede hacer un descriptor de acceso para mantener el "10" como int 10 en él.
Ejemplo:
x = tonumber("10")
si imprime la variable x, generará un int 10 y no "10"
igual que el proceso de Python
x = int ("10")
Gracias.
Recomendaría revisar Hyperpolyglot, tiene una comparación increíble: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
PD. En realidad, Lua se convierte en dobles, no en int.
El tipo de número representa números reales (punto flotante de precisión doble).
tonumber
toma dos argumentos, el primero es una cadena que se convierte en número y el segundo es la base de e
.
El valor de retorno tonumber
está en la base 10.
Si no base
se proporciona, convierte el número a base 10.
> a = '101'
> tonumber(a)
101
Si se proporciona base, la convierte a la base dada.
> a = '101'
>
> tonumber(a, 2)
5
> tonumber(a, 8)
65
> tonumber(a, 10)
101
> tonumber(a, 16)
257
>
Si e
contiene caracteres no válidos, entonces regresa nil
.
> --[[ Failed because base 2 numbers consist (0 and 1) --]]
> a = '112'
> tonumber(a, 2)
nil
>
> --[[ similar to above one, this failed because --]]
> --[[ base 8 consist (0 - 7) --]]
> --[[ base 10 consist (0 - 9) --]]
> a = 'AB'
> tonumber(a, 8)
nil
> tonumber(a, 10)
nil
> tonumber(a, 16)
171
Respondí considerando Lua5.3
Lua 5.3.1 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> math.floor("10");
10
> tonumber("10");
10
> "10" + 0;
10.0
> "10" | 0;
10
esto es lo que deberías poner
local stringnumber = "10"
local a = tonumber(stringnumber)
print(a + 10)
output:
20