Lua string to int

183

Jak przekonwertować ciąg znaków na liczbę całkowitą w Lua?

Mam taki ciąg:

a = "10"

Chciałbym, aby został przekonwertowany na 10, liczbę.

David Gomes
źródło
6
Dokładny link to sekcja dotycząca przymusu: 5.1 , 5.2 .
lhf
5
@NicolBolas: +1 za zadanie pytania, które jest pierwszym wynikiem Google i zapewnia bezpośrednią odpowiedź.
ereOn
2
+1, aby zrekompensować temu gryzącemu trollowi Nicol: D
Петър Петров
Lua po prostu automatycznie konwertuje ciągi znaków i liczby. Jeśli chcesz zapewnić typ, użyj a = tonumber (a).
xpol

Odpowiedzi:

299

Użyj tonumberfunkcji . Jak w a = tonumber("10").

Nicol Bolas
źródło
4
W Lua 5.3 (64-bitowe domyślne) liczby całkowite są traktowane odpowiednio ( lua.org/manual/5.3/manual.html ): „Stała liczbowa z ułamkową kropką lub wykładnikiem oznacza liczbę zmiennoprzecinkową; w przeciwnym razie oznacza liczbę całkowitą”.
Kevin Lee
33

Możesz wymusić niejawną konwersję za pomocą ciągu znaków w operacjach arytmetycznych jak w a= "10" + 0, ale nie jest to tak jasne ani tak czyste, jak użycie tonumberjawnie.

lhf
źródło
2
Nie, konwertuje „10” na liczbę całkowitą, a następnie dodaje do niej 0. (Jednak brak jasności jest tym bardziej powodem, aby tonumberzamiast tego używać !)
Rena
16
@Rena, nie brakuje jasności. +jest zawsze wyraźnie dodany, ..- konkatenacja.
Oleg V. Volkov
1
@lhf: automatyczny przymus działa tylko na liczbach. Operatory porównania (== ~ = <> <=> =) nie konwertują swoich argumentów. A ze względu na wydajność powinieneś unikać zbytniego polegania na automatycznym przymusie
wsha
9
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))

Wynik

   string                                                                                                                                                                          
   number

źródło
8

Wszystkie liczby w Lua są zmiennoprzecinkowe ( edytuj: Lua 5.2 lub mniej). Jeśli naprawdę chcesz przekonwertować na „int” (lub przynajmniej powtórzyć to zachowanie), możesz to zrobić:

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

W takim przypadku jawnie konwertujesz ciąg (lub tak naprawdę cokolwiek to jest) na liczbę, a następnie obcinasz liczbę, tak jak zrobiłaby to rzutowanie (int) w Javie.

Edycja: To nadal działa w Lua 5.3, nawet myślałem, że Lua 5.3 ma prawdziwe liczby całkowite, ponieważ math.floor()zwraca liczbę całkowitą, podczas gdy operator, taki jak number // 1, nadal zwróci liczbę zmiennoprzecinkową, jeśli numberjest liczbą zmiennoprzecinkową.

Stormswept
źródło
5

powiedz, że ciąg, który chcesz przekształcić w liczbę, znajduje się w zmiennej S

a=tonumber(S)

pod warunkiem, że są w nim liczby i tylko liczby Szwrócą liczbę, ale jeśli są jakieś znaki, które nie są liczbami (z wyjątkiem kropek dla liczb zmiennoprzecinkowych), zwróci zero

CORE craftX
źródło
4

Bardziej przejrzystą opcją jest użycie liczby tonowej .

Począwszy od 5.3.2, ta funkcja automatycznie wykryje (podpisane) liczby całkowite, zmiennoprzecinkowe (jeśli występuje punkt) i szesnastkowe (zarówno liczby całkowite, jak i zmiennoprzecinkowe, jeśli ciąg zaczyna się od „0x” lub „0X”).

Następujące fragmenty są krótsze, ale nie równoważne:

  • 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
źródło
3

Należy zauważyć, że math.floor()zawsze zaokrągla w dół, a zatem nie daje rozsądnego wyniku dla ujemnych wartości zmiennoprzecinkowych.

Na przykład -10,4 reprezentowane jako liczba całkowita będzie zwykle albo obcięta, albo zaokrąglona do -10. Jednak wynik działania math.floor () nie jest taki sam:

math.floor(-10.4) => -11

W przypadku obcięcia z konwersją typu działa następująca funkcja pomocnicza:

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

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

Leslie Krause
źródło
2

Możesz zrobić akcesor, aby zachować „10” jako int 10 w nim.

Przykład:

x = tonumber("10")

jeśli wypiszesz zmienną x, wyświetli int 10, a nie „10”

taki sam jak proces Python

x = int („10”)

Dzięki.

użytkownik5555332
źródło
1

tonumber (e [, base])

tonumberprzyjmuje dwa argumenty, pierwszy to ciąg, który jest konwertowany na liczbę, a drugi to podstawa e.

Wartość zwracana tonumberjest w podstawie 10.

Jeśli nie basepodano, konwertuje liczbę na bazę 10.

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

Jeśli baza jest podana, konwertuje ją na podaną bazę.

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

Jeśli ezawiera nieprawidłowy znak, wówczas zwraca 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

Odpowiedziałem biorąc pod uwagę Lua 5.3

Shubham
źródło
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
Wiaczesław
źródło
-1

oto co powinieneś umieścić

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

output:

20
jest tam
źródło
a = tonumber (stringnumber) jest
wystarczający