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.
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))
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:
localfunction 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.
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
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 <0and math.ceil( num )or math.floor( num )end
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
Réponses:
Utilisez la
tonumber
fonction . Comme dansa = tonumber("10")
.la source
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'utilisertonumber
explicitement.la source
tonumber
place, cependant!)+
est toujours explicitement addition,..
- concaténation.Production
la source
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:
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 quenumber // 1
retournera toujours un flottant sinumber
est un flottant.la source
dire que la chaîne que vous souhaitez transformer en nombre se trouve dans la variable
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 nilla source
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:
la source
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:
Pour la troncature avec conversion de type, la fonction d'assistance suivante fonctionnera:
Référence: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
la source
Vous pouvez créer un accesseur pour conserver le "10" comme int 10.
Exemple:
si vous imprimez la variable x, elle affichera un int 10 et non "10"
identique au processus Python
x = int ("10")
Merci.
la source
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.
http://www.lua.org/pil/2.3.html
la source
tonumber (e [, base])
tonumber
prend deux arguments, le premier est une chaîne qui est convertie en nombre et le second est la base dee
.La valeur de retour
tonumber
est en base 10.Si non
base
est fourni, il convertit le nombre en base 10.Si la base est fournie, elle la convertit en base donnée.
Si
e
contient un caractère invalide, il retournenil
.J'ai répondu en considérant Lua5.3
la source
la source
voici ce que tu devrais mettre
la source