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.


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:



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.


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

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.


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


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.

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


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.



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


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

-1

voici ce que tu devrais mettre

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

output:

20

a = tonumber (stringnumber) est suffisant
wsha
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.