No Lua 5.3, os números inteiros (padrão de 64 bits) são tratados de acordo ( lua.org/manual/5.3/manual.html ): "Uma constante numérica com um ponto fracionário ou um expoente indica uma flutuação; caso contrário, indica um número inteiro."
Kevin Lee
33
Você pode forçar uma conversão implícita usando uma string em operações aritméticas como em a= "10" + 0, mas isso não é tão claro ou limpo como o uso tonumberexplícito.
Não, ele converterá "10" para inteiro e depois adicionará 0 a ele. (A falta de clareza é mais uma razão para usar tonumberem vez disso, embora!)
Rena
16
@Rena, não há falta de clareza. +é sempre explicitamente adição ..- concatenação.
Oleg V. Volkov
1
@ lhf: coerção automática funcionará apenas em números. E os operadores de comparação (== ~ = <> <=> =) não convertem seus argumentos. E por razões de desempenho que você deve evitar depender de coerção automática demais
WSHA
9
local a ="10"
print(type(a))local num = tonumber(a)
print(type(num))
Todos os números em Lua são flutuantes ( editar: Lua 5.2 ou menos). Se você realmente deseja converter para um "int" (ou pelo menos replicar esse comportamento), pode fazer o seguinte:
localfunction ToInteger(number)return math.floor(tonumber(number)or error("Could not cast '".. tostring(number).."' to number.'"))end
Nesse caso, você converte explicitamente a string (ou realmente, seja o que for) em um número e, em seguida, trunca o número como uma conversão (int) faria em Java.
Edit: Isso ainda funciona no Lua 5.3, mesmo que o Lua 5.3 tenha números inteiros reais, pois math.floor()retorna um número inteiro, enquanto um operador como esse number // 1ainda retornará um float se numberfor um float.
digamos que a string que você deseja transformar em número está na variável S
a=tonumber(S)
desde que existam números e apenas números Sretornem um número, mas se houver caracteres que não sejam números (exceto períodos para flutuações), retornará nulo
A partir da versão 5.3.2, essa função detectará automaticamente números inteiros (sinalizados), float (se houver um ponto) e hexadecimal (números inteiros e floats, se a sequência começar por "0x" ou "0X").
Os seguintes trechos são mais curtos, mas não 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.
Note-se que math.floor()sempre arredonda para baixo e, portanto, não produz um resultado sensível para valores negativos de ponto flutuante.
Por exemplo, -10,4 representado como um número inteiro normalmente seria truncado ou arredondado para -10. No entanto, o resultado de math.floor () não é o mesmo:
math.floor(-10.4)=>-11
Para truncamento com conversão de tipo, a seguinte função auxiliar funcionará:
function tointeger( x )
num = tonumber( x )return num <0and math.ceil( num )or math.floor( num )end
tonumberrecebe dois argumentos, o primeiro é a string que é convertida em número e o segundo é a base de e.
O valor de retorno tonumberestá na base 10.
Se não basefor fornecido, ele converte o número na base 10.
> a ='101'> tonumber(a)101
Se a base for fornecida, ela será convertida na base fornecida.
> a ='101'>> tonumber(a,2)5> tonumber(a,8)65> tonumber(a,10)101> tonumber(a,16)257>
Se econtiver caracteres inválidos, ele retornará 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
Respostas:
Utilizar a
tonumber
função . Como ema = tonumber("10")
.fonte
Você pode forçar uma conversão implícita usando uma string em operações aritméticas como em
a= "10" + 0
, mas isso não é tão claro ou limpo como o usotonumber
explícito.fonte
tonumber
em vez disso, embora!)+
é sempre explicitamente adição..
- concatenação.Resultado
fonte
Todos os números em Lua são flutuantes ( editar: Lua 5.2 ou menos). Se você realmente deseja converter para um "int" (ou pelo menos replicar esse comportamento), pode fazer o seguinte:
Nesse caso, você converte explicitamente a string (ou realmente, seja o que for) em um número e, em seguida, trunca o número como uma conversão (int) faria em Java.
Edit: Isso ainda funciona no Lua 5.3, mesmo que o Lua 5.3 tenha números inteiros reais, pois
math.floor()
retorna um número inteiro, enquanto um operador como essenumber // 1
ainda retornará um float senumber
for um float.fonte
digamos que a string que você deseja transformar em número está na variável
S
desde que existam números e apenas números
S
retornem um número, mas se houver caracteres que não sejam números (exceto períodos para flutuações), retornará nulofonte
A opção mais clara é usar o número .
A partir da versão 5.3.2, essa função detectará automaticamente números inteiros (sinalizados), float (se houver um ponto) e hexadecimal (números inteiros e floats, se a sequência começar por "0x" ou "0X").
Os seguintes trechos são mais curtos, mas não equivalentes:
fonte
Note-se que
math.floor()
sempre arredonda para baixo e, portanto, não produz um resultado sensível para valores negativos de ponto flutuante.Por exemplo, -10,4 representado como um número inteiro normalmente seria truncado ou arredondado para -10. No entanto, o resultado de math.floor () não é o mesmo:
Para truncamento com conversão de tipo, a seguinte função auxiliar funcionará:
Referência: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
fonte
Você pode criar um acessador para manter o "10" como int 10 nele.
Exemplo:
se você imprimir a variável x, ela produzirá um int 10 e não "10"
igual ao processo Python
x = int ("10")
Obrigado.
fonte
Eu recomendaria verificar o Hyperpolyglot, tem uma comparação incrível: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
ps. Na verdade, Lua se converte em dobras e não em ints.
http://www.lua.org/pil/2.3.html
fonte
tonumber (e [, base])
tonumber
recebe dois argumentos, o primeiro é a string que é convertida em número e o segundo é a base dee
.O valor de retorno
tonumber
está na base 10.Se não
base
for fornecido, ele converte o número na base 10.Se a base for fornecida, ela será convertida na base fornecida.
Se
e
contiver caracteres inválidos, ele retornaránil
.Eu respondi considerando Lua5.3
fonte
fonte
aqui está o que você deve colocar
fonte