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ę.
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ę.
Odpowiedzi:
Użyj tonumber
funkcji . Jak w a = tonumber("10")
.
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 tonumber
jawnie.
tonumber
zamiast tego używać !)
+
jest zawsze wyraźnie dodany, ..
- konkatenacja.
local a = "10"
print(type(a))
local num = tonumber(a)
print(type(num))
Wynik
string
number
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 number
jest liczbą zmiennoprzecinkową.
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 S
zwrócą liczbę, ale jeśli są jakieś znaki, które nie są liczbami (z wyjątkiem kropek dla liczb zmiennoprzecinkowych), zwróci zero
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.
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
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.
Poleciłbym sprawdzić Hyperpolyglot, ma niesamowite porównanie: http://hyperpolyglot.org/
http://hyperpolyglot.org/more#str-to-num-note
ps. W rzeczywistości Lua przekształca się w podwójne, a nie w ints.
Typ liczby reprezentuje liczby rzeczywiste (zmiennoprzecinkowe podwójnej precyzji).
tonumber
przyjmuje dwa argumenty, pierwszy to ciąg, który jest konwertowany na liczbę, a drugi to podstawa e
.
Wartość zwracana tonumber
jest w podstawie 10.
Jeśli nie base
podano, 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 e
zawiera 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
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
oto co powinieneś umieścić
local stringnumber = "10"
local a = tonumber(stringnumber)
print(a + 10)
output:
20