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.
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))
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ć:
localfunction 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ą.
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
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 <0and math.ceil( num )or math.floor( num )end
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
Odpowiedzi:
Użyj
tonumber
funkcji . Jak wa = tonumber("10")
.źródło
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życietonumber
jawnie.źródło
tonumber
zamiast tego używać !)+
jest zawsze wyraźnie dodany,..
- konkatenacja.Wynik
źródło
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ć:
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 jaknumber // 1
, nadal zwróci liczbę zmiennoprzecinkową, jeślinumber
jest liczbą zmiennoprzecinkową.źródło
powiedz, że ciąg, który chcesz przekształcić w liczbę, znajduje się w zmiennej
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źródło
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:
źródło
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:
W przypadku obcięcia z konwersją typu działa następująca funkcja pomocnicza:
Odniesienie: http://lua.2524044.n2.nabble.com/5-3-Converting-a-floating-point-number-to-integer-td7664081.html
źródło
Możesz zrobić akcesor, aby zachować „10” jako int 10 w nim.
Przykład:
jeśli wypiszesz zmienną x, wyświetli int 10, a nie „10”
taki sam jak proces Python
x = int („10”)
Dzięki.
źródło
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.
http://www.lua.org/pil/2.3.html
źródło
tonumber (e [, base])
tonumber
przyjmuje dwa argumenty, pierwszy to ciąg, który jest konwertowany na liczbę, a drugi to podstawae
.Wartość zwracana
tonumber
jest w podstawie 10.Jeśli nie
base
podano, konwertuje liczbę na bazę 10.Jeśli baza jest podana, konwertuje ją na podaną bazę.
Jeśli
e
zawiera nieprawidłowy znak, wówczas zwracanil
.Odpowiedziałem biorąc pod uwagę Lua 5.3
źródło
źródło
oto co powinieneś umieścić
źródło