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.


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:



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.


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

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.


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


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.

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


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.



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


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

-1

esto es lo que deberías poner

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

output:

20

a = tonumber (stringnumber) es suficiente
wsha
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.