Lua String zu int

182

Wie kann ich in Lua eine Zeichenfolge in eine Ganzzahl konvertieren?

Ich habe eine Zeichenfolge wie diese:

a = "10"

Ich möchte, dass es in 10, die Zahl, umgewandelt wird.

David Gomes
quelle
6
Der genaue Zusammenhang ist der Abschnitt über Zwang: 5.1 , 5.2 .
lhf
5
@NicolBolas: +1 für das Stellen einer Frage, die das erste Google-Ergebnis ist und eine direkte Antwort liefert.
EreOn
2
+1, um diesen beißenden Troll zu kompensieren Nicol: D
27етър Петров
Lua konvertiert nur automatisch zwischen Zeichenfolgen und Zahlen. Wenn Sie den Typ sicherstellen möchten, verwenden Sie a = tonumber (a).
xpol

Antworten:

298

Verwenden Sie die tonumberFunktion . Wie in a = tonumber("10").

Nicol Bolas
quelle
4
In Lua 5.3 werden (64-Bit-Standard) Ganzzahlen entsprechend behandelt ( lua.org/manual/5.3/manual.html ): "Eine numerische Konstante mit einem Bruchpunkt oder einem Exponenten bezeichnet einen Gleitkommawert, andernfalls bezeichnet sie eine Ganzzahl."
Kevin Lee
33

Sie können eine implizite Konvertierung erzwingen, indem Sie eine Zeichenfolge in einer arithmetischen Operation wie in verwenden a= "10" + 0. Dies ist jedoch nicht ganz so klar oder sauber wie die tonumberexplizite Verwendung .

lhf
quelle
2
Nein, es wird "10" in eine Ganzzahl konvertieren und dann 0 hinzufügen. (Die Unklarheit ist jedoch umso mehr ein Grund, tonumberstattdessen zu verwenden !)
Rena
16
@Rena, es gibt keinen Mangel an Klarheit. +ist immer explizit Addition, ..- Verkettung.
Oleg V. Volkov
1
@lhf: Auto-Zwang funktioniert nur bei Zahlen. Und Vergleichsoperatoren (== ~ = <> <=> =) konvertieren ihre Argumente nicht. Und aus Leistungsgründen sollten Sie vermeiden, sich zu sehr auf automatischen Zwang zu verlassen
wsha
9
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Ausgabe

   string                                                                                                                                                                          
   number

quelle
8

Alle Zahlen in Lua sind Floats ( bearbeiten: Lua 5.2 oder weniger). Wenn Sie wirklich in ein "int" konvertieren möchten (oder dieses Verhalten zumindest replizieren möchten), können Sie dies tun:

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

In diesem Fall konvertieren Sie die Zeichenfolge (oder wirklich was auch immer) explizit in eine Zahl und kürzen die Zahl dann wie eine (int) Umwandlung in Java.

Bearbeiten: Dies funktioniert immer noch in Lua 5.3, obwohl Lua 5.3 echte Ganzzahlen hat, da es math.floor()eine Ganzzahl zurückgibt, während ein Operator wie z. B. number // 1immer noch einen Float zurückgibt, wenn numberes sich um einen Float handelt.

Sturmgepeitscht
quelle
5

Angenommen, die Zeichenfolge, die Sie in eine Zahl umwandeln möchten, befindet sich in der Variablen S

a=tonumber(S)

vorausgesetzt, es gibt Zahlen und nur Zahlen Sgeben eine Zahl zurück, aber wenn es Zeichen gibt, die keine Zahlen sind (außer Punkte für Gleitkommazahlen), wird Null zurückgegeben

KERN craftX
quelle
4

Die klarere Option ist die Verwendung von Tonumber .

Ab 5.3.2 erkennt diese Funktion automatisch (vorzeichenbehaftete) Ganzzahlen, float (wenn ein Punkt vorhanden ist) und hexadezimal (sowohl Ganzzahlen als auch float, wenn die Zeichenfolge mit "0x" oder "0X" beginnt).

Die folgenden Schnipsel sind kürzer, aber nicht gleichwertig:

  • 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
quelle
3

Es ist zu beachten, dass dies math.floor()immer abrundet und daher für negative Gleitkommawerte kein vernünftiges Ergebnis liefert.

Beispielsweise wird -10,4, das als Ganzzahl dargestellt wird, normalerweise entweder abgeschnitten oder auf -10 gerundet. Das Ergebnis von math.floor () ist jedoch nicht dasselbe:

math.floor(-10.4) => -11

Für das Abschneiden mit Typkonvertierung funktioniert die folgende Hilfsfunktion:

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

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

Leslie Krause
quelle
2

Sie können einen Accessor erstellen, um die "10" als int 10 darin zu belassen.

Beispiel:

x = tonumber("10")

Wenn Sie die x-Variable drucken, wird eine int 10 und nicht "10" ausgegeben.

das gleiche wie der Python-Prozess

x = int ("10")

Vielen Dank.

user5555332
quelle
1

tonumber (e [, base])

tonumbernimmt zwei Argumente an, das erste ist eine Zeichenfolge, die in eine Zahl umgewandelt wird, und das zweite ist die Basis von e.

Der Rückgabewert tonumberbefindet sich in Basis 10.

Wenn nein angegeben baseist, wird die Zahl in Basis 10 konvertiert.

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

Wenn eine Basis bereitgestellt wird, wird diese in die angegebene Basis konvertiert.

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

Wenn es ein eungültiges Zeichen enthält, wird es zurückgegeben 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

Ich antwortete unter Berücksichtigung von Lua5.3

Shubham
quelle
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
quelle
-1

Hier ist, was Sie setzen sollten

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

output:

20
Theresaspyaroundhere
quelle
a = tonumber (stringnumber) ist
ausreichend