Lua para int

183

Como posso converter uma string em um número inteiro em Lua?

Eu tenho uma string como esta:

a = "10"

Eu gostaria que fosse convertido para 10, o número.

David Gomes
fonte
6
O link preciso é a seção sobre coerção: 5.1 , 5.2 .
Lhf 9/06/12
5
@ NicolBolas: +1 por fazer uma pergunta que é o primeiro resultado do Google e fornece uma resposta direta ao ponto.
9/10/2014
2
+1 para compensar esse troll mordedor Nicol: D
Петър Петров
Lua apenas converte automaticamente entre strings e números. Se você deseja garantir o tipo, use a = tonumber (a).
Xpol

Respostas:

299

Utilizar a tonumberfunção . Como em a = tonumber("10").

Nicol Bolas
fonte
4
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.

lhf
fonte
2
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))

Resultado

   string                                                                                                                                                                          
   number

fonte
8

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:

local function 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.

Tempestades varridas
fonte
5

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

CORE craftX
fonte
4

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:

  • 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
fonte
3

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 < 0 and math.ceil( num ) or math.floor( num )
end

Referência: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html

Leslie Krause
fonte
2

Você pode criar um acessador para manter o "10" como int 10 nele.

Exemplo:

x = tonumber("10")

se você imprimir a variável x, ela produzirá um int 10 e não "10"

igual ao processo Python

x = int ("10")

Obrigado.

user5555332
fonte
1

tonumber (e [, base])

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

Eu respondi considerando Lua5.3

Shubham
fonte
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
fonte
-1

aqui está o que você deve colocar

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

output:

20
theresaspyaroundhere
fonte
a = tonumber (stringnumber) é Atrav
WSHA