去除数字末尾的零和小数点

3
使用Lua,我可以将数字格式化为可变数量的数字,并去除尾随零/小数点,例如:
string.format(" %."..precision.."f", value):
  gsub("(%..-)0*$", "%1"):
  gsub("%.$", "")

值是数字类型(正数,负数,整数,小数)。

任务已经解决,但出于美观、教育和性能方面的考虑,我想了解是否有更优雅的方法——可能仅使用一个 gsub()

string.format() 中的 %g 不是一个选项,因为要避免科学计数法。


value 有些约束条件吗? - hjpotter92
嗯,它是某种数字,可以是正数或负数,整数或小数。 - Thomas W
4
我会尝试翻译您的内容:我会把第二行修改为:gsub("(%.%d-)0+$", "%1")。如果没有零,它会跳过替换,并将小数点后的字符限制为数字(允许在输入字符串中更灵活)。此外,以冒号开头是链接命令的传统方式(这使您可以在链的末尾注释掉一行而不会出现语法错误)。 - Stuart P. Bentley
@StuartP.Bentley 我原以为换行后的冒号会导致代码无法运行,但你是对的,它可以!我在交互式Lua中尝试过,但那里不行。 - Thomas W
1
请记住,Lua REPL 尽可能快地执行语句,并且您无法继续已经被解释的语句。 - Stuart P. Bentley
1个回答

2
如果你精度始终大于0,则尾随字符保证是浮点数的一系列 0 或整数的 . 后跟一系列 0。因此,你可以识别并删除这个“尾随部分”,留下字符串的其余部分:
string.format(" %."..precision.."f", value)
   :gsub("%.?0+$", "")

当整数以0结尾时,它不会被篡改,因为这些整数在显著的零之后会有浮点数,所以它们不会被视为“字符串末尾前的连续0序列”。

如果精度为0,则根本不应执行gsub


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接