Lua - 数字转字符串的行为

34
我想了解 Lua 如何使用 tostring() 函数处理数字到字符串的转换。
如果数字是整数(例如 number == (int) number),它将被转换为整数(作为字符串输出)吗?或者它总是会输出实数(作为字符串),例如 10.0
我需要在 C 中模仿 Lua 的 tostring 精确行为,但不能使用 Lua C API,因为在这种情况下我没有使用 lua_State

它取决于 Lua 版本。 - Egor Skriptunoff
4个回答

60

在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)。当您需要特定数字格式时,应始终使用显式格式。


谢谢你的帮助。这并不像我预期的那么容易。我正在使用5.3.2版本,不打算使用其他版本。 - Virus721

6
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

谢谢,我会尝试这个方法。不过,Lua的tostring函数没有官方文档吗?我一直在搜索,但信息非常稀少,每次想要获取一些信息都需要阅读整本书... - Virus721
我所能找到的只有http://www.lua.org/pil/2.4.html和http://www.lua.org/manual/5.1/manual.html#lua_tostring。 - codingbunny
正如我所怀疑的那样,如果 number == (int) number,则打印一个整数。我无法相信这些基本函数没有官方文档。无论如何,感谢您的帮助。 - Virus721

4

如果您正在使用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

1
在Lua 5.3中,由于整数类型的存在,对浮点数使用tostring(尽管其数值可能等同于整数)会添加一个"'.0'后缀,但这并不意味着你不能将其缩短!
local str = tostring(n)
if str:sub(-2) == ".0" then
    str = str:sub(1,-3)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接