Lua — поведение числа в строке

Я хотел бы знать, как Lua обрабатывает преобразование числа в строку с помощью функции tostring().

Он будет преобразовываться в int (как строку), если число круглое (т.е. если number == (int) number), или всегда будет выводить действительное число (как строку), например 10.0?

Мне нужно имитировать точное поведение tostring Lua в C, не используя Lua C API, поскольку в этом случае я не использую lua_State.


person Virus721    schedule 16.03.2016    source источник
comment
Это зависит от версии Lua.   -  person Egor Skriptunoff    schedule 16.03.2016


Ответы (4)


В Lua 5.2 и более ранних версиях как tostring(10), так и tostring(10.0) получается строка "10".

В Lua 5.3 это изменилось:

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

Это потому, что в Lua 5.3 появился целочисленный подтип. Из Изменений в языке:

Преобразование числа с плавающей запятой в строку теперь добавляет к результату суффикс .0, если он выглядит как целое число. (Например, число с плавающей запятой 2.0 будет напечатано как 2.0, а не как 2.) Вы всегда должны использовать явный формат, когда вам нужен определенный формат для чисел.

person Yu Hao    schedule 16.03.2016
comment
Спасибо за вашу помощь. Так что это не так просто, как я ожидал. Я использую 5.3.2 и не планирую использовать другую версию. - person Virus721; 16.03.2016

Если вы используете 5.3.4 и вам нужно быстрое исправление, используйте math.floor - он преобразует его в целочисленное число. Это превосходит ответ @warspyking по эффективности, но ему не хватает крутости, которая представляет собой кучу кода.

>tostring(math.floor(54.0))
54
>tostring(54.0)
54.0
>type(math.floor(54.0))
integer
>type(54.0)
number
person user2262111    schedule 21.12.2017

Lua преобразует числа как есть:

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

Если вы хотите поиграть с ними, есть небольшой онлайн-парсер для простых команд, таких как эта: http://www.lua.org/cgi-bin/demo Здесь используется Lua 5.3.1

редактировать Я должен поддержать комментарий Егора, это зависит от версии. Я запустил это локально в своей системе:

Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print(tostring(10))
10
> print(tostring(10.0)) 
10
person codingbunny    schedule 16.03.2016
comment
Спасибо, я попробую это. Разве нет официальной документации о функции tostring lua? Я искал, но информации очень мало, и вы должны читать всю книгу каждый раз, когда вам нужна информация... - person Virus721; 16.03.2016
comment
все, что я смог найти, это lua.org/pil/2.4.html и lua.org/manual/5.1/manual.html#lua_tostring - person codingbunny; 16.03.2016
comment
Ну, как я и подозревал, если number == (int) number, печатается int. Я не могу поверить, что нет официальной документации по этим основным функциям. Все равно, спасибо за помощь. - person Virus721; 16.03.2016

В Lua 5.3, из-за целочисленного типа, tostring у числа с плавающей запятой (хотя его числовое значение может быть эквивалентно целому числу) добавит суффикс "'.0', но это не значит, что его нельзя сократить!

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