V-REP的Lua`tonumber`在Linux上返回nil

时间:2016-04-05 21:31:30

标签: lua type-conversion multiplatform

我们开发了一个简单的HTML entity模拟,它在OS X上运行良好,但在Linux(Ubuntu 15.04)上运行不正常。 V-REP被用作主要的脚本语言。

我们在Linux上附加了以下代码(带有注释中的返回值),但不幸的是在Linux上返回<(但在OS X上将nil转换为数字而没有问题):

e[3]

真正有趣的是,前面的代码在Lua 5.2.3控制台(OS X和Linux)中都能正常工作。但是,在Linux上运行时,V-REP无法正确地将字符串转换为数字。

我们尝试了两个Lua(今天已下载),结果完全相同 - e[3] -- -0.677782532263 type(e[3]) -- string type(tonumber(e[3])) -- nil 。你能指出一些我们遗漏的东西吗? Lua和V-REP都不是我们每天使用的工具。

编辑1: 我使用Ubuntu 15.04。 V-REP使用Lua 5.1,My Lua版本:

nil

在控制台中,我尝试了以下内容:

$ apt-cache policy lua5.1
lua5.1:
  Installed: 5.1.5-7.1
  Candidate: 5.1.5-7.1
  Version table:
 *** 5.1.5-7.1 0
        500 http://cz.archive.ubuntu.com/ubuntu/ vivid/main amd64 Packages
        100 /var/lib/dpkg/status

2 个答案:

答案 0 :(得分:4)

错误是由于 V-REP 使用 Lua 5.1 ,而我们测试它的计算机有不同的数字区域设置(linux有{{ 1}}和mac有可能LC_NUMERIC=cs_CZ.UTF-8)。

这意味着Mac上的Lua将字符串中的浮点数识别为数字,但Linux上具有不同语言环境的Lua没有 - 它没有逗号(例如{{1 }})作为区域设置所需的小数分隔符,因此它为转换返回了nil。

修复是在将vrep运行到en_US语言环境之前设置-3,513标志,如下所示:

LC_NUMERIC

会强制语言环境基于点,并使Lua能够识别数字。

感谢@Etan提供所有帮助,并从正确的方向探讨问题。

答案 1 :(得分:0)

另一种通过lua代码设置语言环境的方法,例如os.setlocale(“ C”)

并非所有系统都可以在启动时更改任意应用程序的语言环境,有时有时需要更改整个系统的语言环境,这对于其他应用程序可能不方便。如果使用V-REP分发的脚本以与XML文件相同的方式分发,其中分隔符是一个句点而不是一个逗号,那么在调用tonumber函数之前,应该从LUA安装正确的控制台是合乎逻辑的而不是外部,通过开放环境的变量。

LUA文档清楚地描述了os.setLocale函数的用途,并明确指出它影响字符串到数字的转换。并指出需要在调用转换函数之前确保正确的设置。

此外,在自己内部更改语言环境的脚本更具可移植性,因为不需要启动人员就应该从外部指定V-REP的哪些环境变量的知识。