web-dev-qa-db-fra.com

Lua string to int

Comment puis-je convertir une chaîne en un entier dans Lua? Je vous remercie.

J'ai une chaîne comme celle-ci:

a = "10"

Je voudrais qu'il soit converti en 10, le nombre.

151
David Gomes

Utilisez la fonction tonumber . Comme dans a = tonumber("10").

250
Nicol Bolas

Vous pouvez forcer une conversion implicite en utilisant une chaîne dans une opération arithmétique comme dans a= "10" + 0, mais cela n’est pas aussi clair ni net que l’utilisation explicite de tonumber.

30
lhf

Tous les nombres en Lua sont des flottants ( edit: Lua 5.2 ou moins). Si vous voulez vraiment convertir en "int" (ou au moins répliquer ce comportement), vous pouvez le faire:

local function ToInteger(number)
    return math.floor(tonumber(number) or error("Could not cast '" .. tostring(number) .. "' to number.'"))
end

Dans ce cas, vous convertissez explicitement la chaîne (ou en réalité, quelle qu’elle soit) en un nombre, puis vous le tronquez comme le ferait un cast (int) en Java. 

Edit: Ceci fonctionne toujours dans Lua 5.3, même si Lua 5.3 a de vrais entiers, puisque math.floor() renvoie un entier, alors qu'un opérateur tel que number // 1 retournera toujours un float si number est un float. 

7
Stormswept
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Sortie

   string                                                                                                                                                                          
   number
7
user4700203

dire que la chaîne que vous voulez transformer en nombre est dans la variable S

a=tonumber(S)

à condition qu'il y ait des nombres et uniquement des nombres dans S, il retournera un nombre, mais s'il y a des caractères qui ne sont pas des nombres (sauf les périodes pour les flottants) , il retournera nil

4
CORE craftX

L'option la plus claire consiste à utiliser tonumber .

A partir de 5.3.2, cette fonction détectera automatiquement les entiers (signés), float (si un point est présent) et hexadécimal (entiers et float, si la chaîne commence par "0x" ou "0X").

Les extraits suivants sont plus courts mais non équivalents:

  • 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.
    
4
4xel

Je recommande de vérifier Hyperpolyglot, a une comparaison impressionnante: http://hyperpolyglot.org/

http://hyperpolyglot.org/more#str-to-num-note

ps. En réalité, Lua se transforme en double et non en ints.

Le type de nombre représente réel (virgule flottante double précision) Nombres.

http://www.lua.org/pil/2.3.html

2
Marcs

Vous pouvez faire un accesseur pour garder le "10" comme int 10 dedans.

Exemple:

x = tonumber("10")

si vous imprimez la variable x, il générera un int 10 et non "10"

comme processus Python

x = int ("10")

Merci.

2
user5555332

Il est à noter que math.floor() arrondit toujours le résultat et ne donne donc pas de résultat raisonnable pour les valeurs en virgule flottante négatives.

Par exemple, -10.4 représenté sous forme d'entier serait généralement tronqué ou arrondi à -10. Pourtant, le résultat de math.floor () n’est pas le même:

math.floor(-10.4) => -11

Pour la troncature avec conversion de type, la fonction d'assistance suivante fonctionnera:

function tointeger( x )
    num = tonumber( x )
    return num < 0 and math.ceil( num ) or math.floor( num )
end

Référence: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html

1
Leslie Krause

tonumber (e [, base])

tonumber prend deux arguments, le premier est une chaîne qui est convertie en nombre et le second est la base de e.

La valeur de retour tonumber est en base 10.

Si aucun base n'est fourni, il convertit le nombre en base 10.

> a = '101'
> tonumber(a)
101

Si base est fournie, elle est convertie en base donnée.

> a = '101'
> 
> tonumber(a, 2)
5
> tonumber(a, 8)
65
> tonumber(a, 10)
101
> tonumber(a, 16)
257
> 

Si e contient un caractère non valide, il renvoie 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

J'ai répondu en considérant Lua5.3

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