nodemcu string.format 奇怪的结果
Posted
技术标签:
【中文标题】nodemcu string.format 奇怪的结果【英文标题】:nodemcu string.format odd results 【发布时间】: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
【问题讨论】:
【参考方案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 的错误以上是关于nodemcu string.format 奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章