Lua - 数字和字符串的处理方式

我想了解 Lua 如何使用 tostring() 函数处理数字和字符串之间的转换。

如果数字是整数(即 number == (int) number),它会将其转换为整数(作为字符串)吗?还是始终将其输出为实数(作为字符串),例如 10.0

我需要在 C 中模仿 Lua 的 tostring 的确切行为,但不能使用 Lua C API,因为在这种情况下,我没有使用 lua_State

点赞
用户518500
用户518500

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
2016-03-16 09:20:31
用户1009479
用户1009479

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

2016-03-16 09:29:19
用户3979429
用户3979429

在 Lua 5.3 中,由于整数类型的存在,tostring 在浮点数上(即使其数字值等同于整数)会添加一个 ".0" 后缀,但这并不意味着你不能缩短它!

local str = tostring(n)
if str:sub(-2) == ".0" then
    str = str:sub(1,-3)
end
2016-03-16 17:01:54
用户2262111
用户2262111

如果您正在使用5.3.4并且需要快速修复,请使用math.floor-将其强制转换为int数字。这比@ warspyking的答案效率更高,但缺少了大量代码的酷度。

>tostring(math.floor(54.0))
54
>tostring(54.0)
54.0
>type(math.floor(54.0))
integer
>type(54.0)
number
2017-12-21 04:56:08