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.
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))
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:
localfunction 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.
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
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 <0and math.ceil( num )or math.floor( num )end
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
Respuestas:
Usa la
tonumber
función . Al igual que ena = tonumber("10")
.fuente
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 usarlotonumber
explícitamente.fuente
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.Salida
fuente
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:
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 comonumber // 1
todavía devolverá un flotante sinumber
es flotante.fuente
digamos que la cadena que quieres convertir en un número está en la variable
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á cerofuente
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:
fuente
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:
Para el truncamiento con conversión de tipo, funcionará la siguiente función auxiliar:
Referencia: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
fuente
Puede hacer un descriptor de acceso para mantener el "10" como int 10 en él.
Ejemplo:
si imprime la variable x, generará un int 10 y no "10"
igual que el proceso de Python
x = int ("10")
Gracias.
fuente
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.
http://www.lua.org/pil/2.3.html
fuente
tonumber (e [, base])
tonumber
toma dos argumentos, el primero es una cadena que se convierte en número y el segundo es la base dee
.El valor de retorno
tonumber
está en la base 10.Si no
base
se proporciona, convierte el número a base 10.Si se proporciona base, la convierte a la base dada.
Si
e
contiene caracteres no válidos, entonces regresanil
.Respondí considerando Lua5.3
fuente
fuente
esto es lo que deberías poner
fuente