Lua stringa a int


183

Come posso convertire una stringa in un numero intero in Lua?

Ho una stringa come questa:

a = "10"

Vorrei che fosse convertito in 10, il numero.


6
Il collegamento preciso è la sezione sulla coercizione: 5.1 , 5.2 .
lhf,

5
@NicolBolas: +1 per porre una domanda che è il primo risultato di Google e fornisce una risposta diretta al punto.
Il

2
+1 per compensare questo troll pungente Nicol: D
Петър Петров

Lua esegue automaticamente la conversione tra stringhe e numeri. Se si desidera assicurarsi del tipo, utilizzare a = tonumber (a).
xpol,

Risposte:



33

Puoi forzare una conversione implicita usando una stringa in operazioni aritmetiche come in a= "10" + 0, ma questo non è così chiaro o pulito come usare tonumberesplicitamente.


2
No, convertirà "10" in numero intero e quindi aggiungerà 0 ad esso. (Tuttavia, la mancanza di chiarezza è una ragione in più da usare tonumber!)
Rena,

16
@Rena, non manca la chiarezza. +è sempre esplicitamente aggiunta, ..- concatenazione.
Oleg V. Volkov,

1
@lhf: la coercizione automatica funzionerà solo sui numeri. E gli operatori di confronto (== ~ = <> <=> =) non convertono i loro argomenti. E per motivi di prestazioni dovresti evitare di fare troppo affidamento sulla coercizione automatica
wsha

9
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Produzione

   string                                                                                                                                                                          
   number

8

Tutti i numeri in Lua sono float ( modifica: Lua 5.2 o meno). Se vuoi veramente convertirti in un "int" (o almeno replicare questo comportamento), puoi farlo:

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

Nel qual caso converti esplicitamente la stringa (o davvero, qualunque essa sia) in un numero, quindi tronca il numero come farebbe un cast (int) in Java.

Modifica: Funziona ancora in Lua 5.3, anche se Lua 5.3 ha numeri interi reali, poiché math.floor()restituisce un numero intero, mentre un operatore come number // 1restituirà comunque un float se numberè float.


5

supponiamo che la stringa che vuoi trasformare in un numero sia nella variabile S

a=tonumber(S)

purché ci siano numeri e solo i numeri in Sesso restituiranno un numero, ma se ci sono caratteri che non sono numeri (tranne i periodi per i float) restituirà zero


4

L'opzione più chiara è utilizzare il numero .

A partire dalla 5.3.2, questa funzione rileverà automaticamente interi (con segno), float (se è presente un punto) ed esadecimali (sia interi che float, se la stringa inizia con "0x" o "0X").

I seguenti frammenti sono più brevi ma non equivalenti:

  • 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

Va notato che math.floor()arrotonda sempre per difetto e quindi non produce un risultato ragionevole per valori a virgola mobile negativi.

Ad esempio, -10.4 rappresentato come un numero intero viene normalmente troncato o arrotondato a -10. Tuttavia il risultato di math.floor () non è lo stesso:

math.floor(-10.4) => -11

Per il troncamento con conversione del tipo, la seguente funzione di supporto funzionerà:

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

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


2

È possibile creare un accessor per mantenere "10" come int 10 in esso.

Esempio:

x = tonumber("10")

se si stampa la variabile x, verrà generato un int 10 e non "10"

lo stesso del processo Python

x = int ("10")

Grazie.



1

tonumber (e [, base])

tonumberaccetta due argomenti, il primo è la stringa che viene convertita in numero e il secondo è la base di e.

Il valore di ritorno tonumberè in base 10.

Se non baseviene fornito, converte il numero in base 10.

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

Se viene fornita la base, la converte nella base indicata.

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

Se econtiene caratteri non validi, viene restituito 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

Ho risposto considerando 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

ecco cosa dovresti mettere

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

output:

20

a = tonumber (stringnumber) è sufficiente
wsha
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.