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 .
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))
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:
localfunction 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.
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
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.
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 <0and math.ceil( num )or math.floor( num )end
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
Antworten:
Verwenden Sie die
tonumber
Funktion . Wie ina = tonumber("10")
.quelle
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 dietonumber
explizite Verwendung .quelle
tonumber
stattdessen zu verwenden !)+
ist immer explizit Addition,..
- Verkettung.Ausgabe
quelle
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:
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 // 1
immer noch einen Float zurückgibt, wennnumber
es sich um einen Float handelt.quelle
Angenommen, die Zeichenfolge, die Sie in eine Zahl umwandeln möchten, befindet sich in der Variablen
S
vorausgesetzt, es gibt Zahlen und nur Zahlen
S
geben eine Zahl zurück, aber wenn es Zeichen gibt, die keine Zahlen sind (außer Punkte für Gleitkommazahlen), wird Null zurückgegebenquelle
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:
quelle
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:
Für das Abschneiden mit Typkonvertierung funktioniert die folgende Hilfsfunktion:
Referenz: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
quelle
Sie können einen Accessor erstellen, um die "10" als int 10 darin zu belassen.
Beispiel:
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.
quelle
Ich würde empfehlen, Hyperpolyglot zu überprüfen, hat einen tollen Vergleich: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
ps. Eigentlich wandelt sich Lua in Doppel um, nicht in Ints.
http://www.lua.org/pil/2.3.html
quelle
tonumber (e [, base])
tonumber
nimmt zwei Argumente an, das erste ist eine Zeichenfolge, die in eine Zahl umgewandelt wird, und das zweite ist die Basis vone
.Der Rückgabewert
tonumber
befindet sich in Basis 10.Wenn nein angegeben
base
ist, wird die Zahl in Basis 10 konvertiert.Wenn eine Basis bereitgestellt wird, wird diese in die angegebene Basis konvertiert.
Wenn es ein
e
ungültiges Zeichen enthält, wird es zurückgegebennil
.Ich antwortete unter Berücksichtigung von Lua5.3
quelle
quelle
Hier ist, was Sie setzen sollten
quelle