Chaîne Lua en int

183

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.

David Gomes
la source
6
Le lien précis est la section sur la coercition: 5.1 , 5.2 .
lhf
5
@NicolBolas: +1 pour poser une question qui est le premier résultat Google et fournit une réponse directe.
ereOn
2
+1 pour compenser ce troll mordant Nicol: D
Петър Петров
Lua effectue simplement une conversion automatique entre les chaînes et les nombres. Si vous voulez vérifier le type, utilisez a = tonumber (a).
xpol

Réponses:

299

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

Nicol Bolas
la source
4
Dans Lua 5.3, les entiers (64 bits par défaut) sont traités en conséquence ( lua.org/manual/5.3/manual.html ): "Une constante numérique avec un point fractionnaire ou un exposant désigne un flottant; sinon, elle désigne un entier."
Kevin Lee
33

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 tonumberexplicitement.

lhf
la source
2
Non, il convertira "10" en entier, puis y ajoutera 0. (Le manque de clarté est une raison de plus pour l'utiliser à la tonumberplace, cependant!)
Rena
16
@Rena, la clarté ne manque pas. +est toujours explicitement addition, ..- concaténation.
Oleg V. Volkov
1
@lhf: la coercition automatique ne fonctionnera que sur les nombres. Et les opérateurs de comparaison (== ~ = <> <=> =) ne convertissent pas leurs arguments. Et pour des raisons de performances, vous devriez éviter de trop compter sur la coercition automatique
wsha
9
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Production

   string                                                                                                                                                                          
   number

la source
8

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 // 1retournera toujours un flottant si numberest un flottant.

Tempête
la source
5

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 Srenvoient 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

CORE craftX
la source
4

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.
4xel
la source
3

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

Leslie Krause
la source
2

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.

user5555332
la source
1

tonumber (e [, base])

tonumberprend 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 tonumberest en base 10.

Si non baseest 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 econtient 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

Shubham
la source
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
la source
-1

voici ce que tu devrais mettre

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

output:

20
il y a là
la source
a = tonumber (stringnumber) est suffisant
wsha