在Lua中将格式字符串转换成最小长度的数字。

例如,我需要至少有 3 位数的数字

"512" --> 512
"24"  --> 24.0
"5"   --> 5.00

一个选项是编写一个小函数。对于我的情况,使用这里的答案,它会像这样:

function f(value, w)
    local p = math.ceil(math.log10(value))
    local prec = value <= 1 and w - 1 or p > w and 0 or w - p
    return string.format('%.' .. prec .. 'f', value)
end

print(f(12, 3))

但是也许可以使用 string.format() 或任何其他简单的方法?

点赞
用户1601606
用户1601606

你无法强制输出与你的示例相同. 最多只能指定浮点精度或数字数量. Lua 使用类似于 C 的 printf 函数,带有少量限制 参考. 可在此处查看完整的说明符列表 链接. 记得不支持某些说明符.

编写一个函数是最佳且唯一的解决方案,特别是因为你的任务看起来很奇怪,因为它不计算小数点.

2014-04-20 03:49:21
用户869951
用户869951

由于 string.format 使用了 printf,并没有专门针对这种情况的格式代码(例如 *,如果有该符号,下面给出的解决方案就更加简便。)。因此您需要自己实现,例如:

function f(num, w)
    -- 获取小数点前的数字个数
    local intWidth = math.ceil(math.log10(num))
    -- 如果 intWidth > w then ... end -- 或许需要
    local fmt='%'..w..'.' .. (w-intWidth) .. 'f'
    return string.format(fmt, num)
end

print(f(12, 4))
print(f(12, 3))
print(f(12, 2))

print(f(512, 3))
print(f(24, 3))
print(f(5, 3))

您应该处理整数部分不能适应字段宽度的情况(返回 ceil 或 floor?)。

2014-04-20 04:27:34
用户88888888
用户88888888

好的,看起来这个问题已经超出了 string.format 的能力范围。感谢 @Schollii 帮助,这是我目前的变体:

function f(value, w)
    local p = math.ceil(math.log10(value))
    local prec = value <= 1 and w - 1 or p > w and 0 or w - p
    return string.format('%.' .. prec .. 'f', value)
end

print(f(12, 3))
2014-04-20 17:56:48