Comment puis-je convertir une chaîne en entier dans Lua?
J'ai une chaîne comme celle-ci:
a = "10"
Je voudrais qu'il soit converti en 10, le nombre.
Comment puis-je convertir une chaîne en entier dans Lua?
J'ai une chaîne comme celle-ci:
a = "10"
Je voudrais qu'il soit converti en 10, le nombre.
Réponses:
Utilisez la tonumber
fonction . Comme dans a = tonumber("10")
.
Vous pouvez forcer une conversion implicite en utilisant une chaîne dans des opérations arithmétiques comme dans a= "10" + 0
, mais ce n'est pas aussi clair ou aussi propre que d'utiliser tonumber
explicitement.
tonumber
place, cependant!)
+
est toujours explicitement addition, ..
- concaténation.
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))
Production
string
number
Tous les nombres dans Lua sont des flotteurs ( éditer: 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 vraiment, quoi que ce soit) en un nombre, puis tronquez le nombre comme le ferait un cast (int) en Java.
Edit: Cela fonctionne toujours dans Lua 5.3, même si Lua 5.3 a des nombres entiers réels, car math.floor()
renvoie un entier, alors qu'un opérateur tel que number // 1
retournera toujours un flottant si number
est un flottant.
dire que la chaîne que vous souhaitez transformer en nombre se trouve dans la variable S
a=tonumber(S)
à condition qu'il y ait des nombres et que seuls des nombres S
renvoient un nombre, mais s'il y a des caractères qui ne sont pas des nombres (à l'exception des points pour les flottants), il renverra nil
L'option la plus claire est d'utiliser le numéro de ton .
À partir de 5.3.2, cette fonction détectera automatiquement les entiers (signés), les nombres flottants (si un point est présent) et hexadécimaux (à la fois les entiers et les flottants, si la chaîne commence par "0x" ou "0X").
Les extraits de code suivants sont plus courts mais pas é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.
Il convient de noter que l' math.floor()
arrondit toujours vers le bas et ne donne donc pas de résultat raisonnable pour les valeurs à virgule flottante négatives.
Par exemple, -10,4 représenté par un 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
Vous pouvez créer un accesseur pour conserver le "10" comme int 10.
Exemple:
x = tonumber("10")
si vous imprimez la variable x, elle affichera un int 10 et non "10"
identique au processus Python
x = int ("10")
Merci.
Je recommanderais de vérifier Hyperpolyglot, a une comparaison impressionnante: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
ps. En fait, Lua se convertit en doubles et non en entiers.
Le type de nombre représente des nombres réels (virgule flottante double précision).
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 non base
est fourni, il convertit le nombre en base 10.
> a = '101'
> tonumber(a)
101
Si la base est fournie, elle la convertit 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 invalide, il retourne 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
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