首页 > 解决方案 > nodemcu string.format 奇怪的结果

问题描述

我需要浮点数的特定格式: (sign)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

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

构建于 2018 年 4 月 9 日 15:12 创建,由 SDK 2.2.1(cfd48f3) 上的 Lua 5.1.4 提供支持

BR, eHc

标签: luanodemcu

解决方案


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

string.formatLua通过将格式说明符交给 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目前没有为数字实现格式 - 正如您所注意到的,它只是在左侧填充,无论符号如何。


推荐阅读