2016-03-16 11 views
5

Chciałbym wiedzieć, jak Lua obsługuje liczbę konwersji ciągów przy użyciu funkcji tostring().Lua - zachowanie numeru do ciągu znaków

Konwertuje się na int (jako ciąg), jeśli liczba jest okrągła (np. number == (int) number) lub czy zawsze będzie generować rzeczywisty (jako łańcuch), taki jak 10.0?

Muszę naśladować dokładne zachowanie Lui w tostring w C, bez korzystania z API Lua C, ponieważ w tym przypadku nie używam lua_State.

+0

To zależy od wersji Lua. –

Odpowiedz

10

w Lua 5.2 lub wcześniej, zarówno tostring(10) i tostring(10.0) wynik jako ciąg "10".

w Lua 5.3 to się zmieniło:

print(tostring(10)) -- "10" 
print(tostring(10.0)) -- "10.0" 

To dlatego Lua 5.3 wprowadzono podtyp całkowitą. Od Changes in the Language:

Konwersja float na sznurku teraz dodaje .0 przyrostek do wyniku jeśli wygląda całkowitej. (Na przykład float 2.0 zostanie wydrukowany jako 2.0, a nie jako 2.) Zawsze należy używać formatu jawnego, gdy potrzebny jest określony format liczb.

+0

Dzięki za pomoc. Więc nie jest tak łatwo, jak się spodziewałem. Używam 5.3.2 i nie planuję użyć innej wersji. – Virus721

2

Lua konwertuje numery jak:

print(tostring(10)) => "10" 
print(tostring(10.0)) => "10.0" 
print(tostring(10.1)) => "10.1" 

Jeśli chcesz się bawić z nimi, jest tam mały parser online dla prostych poleceń, takich jak ten: http://www.lua.org/cgi-bin/demo używa Lua 5.3.1

edytuj Muszę poprzeć komentarz Egora, zależny od wersji. wpadłem to lokalnie na moim systemie:

Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio 
> print(tostring(10)) 
10 
> print(tostring(10.0)) 
10 
+0

Dzięki temu spróbuję tego. Czy nie ma oficjalnej dokumentacji dotyczącej funkcji ściągania lua? Szukałem, ale informacje są naprawdę rzadkie i musisz przeczytać całą książkę za każdym razem, gdy chcesz informacji ... – Virus721

+0

wszystko co mogłem znaleźć to http://www.lua.org/pil/2.4.html i http://www.lua.org/manual/5.1/manual.html#lua_tostring –

+0

Tak jak podejrzewałem, jeśli liczba == (int), to drukuje int. Nie mogę uwierzyć, że nie ma oficjalnej dokumentacji tych podstawowych funkcji. Dzięki za pomoc. – Virus721

0

w Lua 5.3, ze względu na typ Integer tostring na pływaka (choć to wartość liczbowa może być równoważne do liczby całkowitej) nada "'.0' sufiks, ale to nie znaczy, że nie może go skrócić !

local str = tostring(n) 
if str:sub(-2) == ".0" then 
    str = str:sub(1,-3) 
end 
1

Jeśli używasz 5.3.4 i trzeba szybkie poprawki, użyj Math.floor - rzuca go do int-numer. To bije odpowiedź @warspyking w wydajności, ale brakuje chłodu, który jest gronami kodu.

>tostring(math.floor(54.0)) 
54 
>tostring(54.0) 
54.0