Lua string a int

183

¿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.

David Gomes
fuente
66
El enlace preciso es la sección sobre coerción: 5.1 , 5.2 .
lhf
55
@NicolBolas: +1 por hacer una pregunta que es el primer resultado de Google y proporciona una respuesta directa.
antes del
2
+1 para compensar a este troll mordaz Nicol: D
Петър Петров
Lua solo realiza automáticamente la conversión entre cadenas y números. Si desea asegurar el tipo, use a = tonumber (a).
xpol

Respuestas:

299

Usa la tonumberfunción . Al igual que en a = tonumber("10").

Nicol Bolas
fuente
44
En Lua 5.3, los enteros (valor predeterminado de 64 bits) se tratan en consecuencia ( lua.org/manual/5.3/manual.html ): "Una constante numérica con un punto fraccionario o un exponente denota un flotante; de ​​lo contrario, denota un entero".
Kevin Lee
33

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 tonumberexplícitamente.

lhf
fuente
2
No, convertirá "10" a entero y luego le agregará 0. ( tonumber¡Sin embargo, la falta de claridad es una razón más para usar en su lugar!)
Rena
16
@Rena, no hay falta de claridad. +siempre es explícitamente suma, ..- concatenación.
Oleg V. Volkov
1
@lhf: la coerción automática solo funcionará con números. Y los operadores de comparación (== ~ = <> <=> =) no convierten sus argumentos. Y por razones de rendimiento, debe evitar depender demasiado de la coerción automática
wsha
9
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Salida

   string                                                                                                                                                                          
   number

fuente
8

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 // 1todavía devolverá un flotante si numberes flotante.

Tormentas
fuente
5

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

CORE craftX
fuente
4

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.
4xel
fuente
3

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

Leslie Krause
fuente
2

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.

usuario5555332
fuente
1

tonumber (e [, base])

tonumbertoma 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 tonumberestá en la base 10.

Si no basese 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 econtiene 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

shubham
fuente
0
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
Viacheslav
fuente
-1

esto es lo que deberías poner

local stringnumber = "10"
local a = tonumber(stringnumber)
print(a + 10)

output:

20
hay espiralesaquí
fuente
a = tonumber (stringnumber) es suficiente
wsha