nodemcu string.format 奇怪的结果

我需要一个特定的浮点数格式:(符号)xx.dd 当我尝试为这个格式设置 string.format 时,我得到了奇怪的结果。

h= 5.127 --(它应该被转换为 +05.13)

print(string.format("%+05.2f",h))
-->  05.13

print(string.format("%+06.2f",h))
--> 005.13

h= -5.127 --(它应该被转换为 -05.13)

print(string.format("%05.2f",h))
--> -5.13

print(string.format("%06.2f",h))
--> 0-5.13

当然,我有一个简单的解决方法,但我认为这个版本中有些问题。

版本创建于 2018-04-09 15:12 由 Lua 5.1.4 和 SDK 2.2.1(cfd48f3) 支持。

敬礼, eHc

点赞
用户4117435
用户4117435

这是 NodeMCU 中的一个 bug(或者未记录的缺陷)。

Lua 大部分实现了 string.format 格式说明符的处理,其将它们交给了 C 标准库的 sprintf 函数。(虽然 sprintf 允许一些 Lua 不允许的操作,但使用 + 应该没问题。)

NodeMCU 修改了 Lua,用 NodeMCU 自己定义的调用替换了大部分(或者全部)标准库的调用(这通常是荒唐的,但在嵌入式系统领域也许没问题)。NodeMCU 的 sprintf 实现不支持 +

以下是 NodeMCU 源代码中的相关代码(c_stdio.c),需要注意的是格式说明符的未知字符被静默忽略:

for (; *s; s++) {
    if (strchr("bcdefgilopPrRsuxX%", *s))
        break;
    else if (*s == '-')
        fmt = FMT_LJUST;
    else if (*s == '0')
        fmt = FMT_RJUST0;
    else if (*s == '~')
        fmt = FMT_CENTER;
    else if (*s == '*') {
        // [snip]
        // ...
    } else if (*s >= '1' && *s <= '9') {
        // [snip]
        // ...
    } else if (*s == '.')
        haddot = 1;
}

同样地,目前对于数字而言,0 格式也没有被实现,正如你所发现的那样,它只是在左边填充。

2018-04-27 02:32:26