nodemcu string.format奇数结果

时间:2018-04-26 15:41:00

标签: lua nodemcu

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

h= 5.127 --(it should beconverted to +05.13)

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

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

h= -5.127 --(it should beconverted to -05.13)

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

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

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

build在2018-04-09 15:12创建  由SDK 2.2.1(cfd48f3)上的Lua 5.1.4提供支持

BR, EHC

1 个答案:

答案 0 :(得分:0)

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

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格式化 - 正如您所注意到的那样,无论符号如何,它都会在左侧填充。