【问题标题】:nodemcu string.format odd resultsnodemcu string.format 奇怪的结果
【发布时间】:2018-10-07 09:27:55
【问题描述】:

我需要浮点数的特定格式:(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-04-09 15:12 创建 由 SDK 2.2.1(cfd48f3) 上的 Lua 5.1.4 提供支持

BR, eHc

【问题讨论】:

    标签: lua nodemcu


    【解决方案1】:

    这是 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 格式目前还没有为数字实现 - 正如您所注意到的,它只是在左侧填充而不考虑符号。

    【讨论】:

    • 好的,非常感谢。还要看 print(string.format("%06.2f",h)) 是否有负值 --> 0-5.13,这真的很奇怪。
    • 是的,这也是 NodeMCU 的 sprintf 实现中的一个错误——零填充不尊重数字格式的符号。
    • @tehtmi 随时向github.com/nodemcu/nodemcu-firmware/issues提交针对 NodeMCU 的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2012-12-16
    • 2012-12-06
    • 2016-08-24
    • 2018-01-24
    • 2021-03-01
    相关资源
    最近更新 更多