我想知道Lua如何使用tostring()
函数处理数字到字符串的转换。
如果数字是圆的(即number == (int) number
),它会转换为int(作为字符串)还是总是输出像10.0
那样的真实字符串(如字符串)? / p>
我需要模仿Lua的tostring
在C中的确切行为,而不使用Lua C API,因为在这种情况下,我没有使用lua_State
。
答案 0 :(得分:22)
在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引入了整数子类型。来自Changes in the Language:
如果float看起来像一个整数,那么将float转换为字符串现在会为结果添加
.0
后缀。 (例如,浮动2.0
将打印为2.0
,而不是2
。)当您需要特定的数字格式时,应始终使用显式格式。
答案 1 :(得分:2)
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
修改强> 我必须支持Egor的评论,它依赖于版本。 我在我的系统上本地运行:
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print(tostring(10))
10
> print(tostring(10.0))
10
答案 2 :(得分:1)
如果您使用5.3.4并且需要快速修补程序,请使用math.floor - 它将其强制转换为int-number。这在效率方面击败了@warspyking答案,但缺乏一堆代码的酷感。
>tostring(math.floor(54.0))
54
>tostring(54.0)
54.0
答案 3 :(得分:0)
在Lua 5.3中,由于整数类型,浮点数上的tostring
(虽然它的数值可能等于整数)会添加一个"'.0'
后缀,但是没有“这意味着你不能缩短它!”
local str = tostring(n)
if str:sub(-2) == ".0" then
str = str:sub(1,-3)
end