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.


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:



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 .


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

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.


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


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.

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


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.



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


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

Hier ist, was Sie setzen sollten

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

output:

20

a = tonumber (stringnumber) ist
ausreichend
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.