已关闭
我正在尝试将数字转换为熟悉的格式,例如 1000 会变成 1k ,依此类推。我希望它上升到我已经尝试完成的 qn 区域,而我遇到的问题是当我尝试将数字四舍五入到最接近的第一位数字时。
例如, 59127327 可以变成 60000000 ,而我可以 tostring 和 gsub 到 60M
所以我实际上是在寻找一种算法,将所有后个数字更改为0,同时保持整数的位数。
示例: 100000 -> 100k
我正在用金钱开发一款roblox游戏,必须将其转化为我上面所述的熟悉格式。谢谢!
答案 0 :(得分:1)
因此,如果理解正确,则只需要一个有效数字,可能需要最多两个零,所以您需要1-3个数字和一个数量级,您可以将其转换为要显示在最后的字符。
首先,就像@fvu的注释一样,您可以使用math.log10
来获取数字中的位数,因为整数部分和小数部分是您在0到10之间的距离。您可以使用“ math.modf”将这些部分分开。在lua中:
local int, frac = math.modf(math.log10(value))
-- 7, 0.77178824606507 for 59127327
数量级是您拥有的数千个,因此将int部分除以3。其mod为多余的零。带有7位数字的示例的大小为2(1,000,000),另外1个零(7-2 * 3):
local magnitude = math.floor(int / 3)
local zeroes = int - magnitude * 3
现在将小数部分的幂提高10,将使您的手指数字高。如果要舍入而不是截断,则在铺地板之前添加0.5(样本应该是60m,对吗?),然后再添加额外的零:
local digit = math.floor(math.pow(10, frac) + 0.5)
local num = digit * math.pow(10, zeroes)
如果您希望所有显示的数字都有效(即用'59m'代替'60m'),请在zeroes
上加frac
,然后再取10的幂:
local num = math.floor(math.pow(10, frac + zeroes) + 0.5)
接下来使用幅度获取字符串(如果未指定,则默认使用指数表示法):
local powers = {[0]='', 'k', 'm', 'b', 't'}
local magnitudeString = powers[magnitude]
magnitudeString = magnitudeString or 'e'..tostring(magnitude)
然后将num
与magnitudeString
结合使用以获得结果:
local result = tostring(num)..magnitudeString
codepad link,Here's a link 到具有功能的键盘上,该功能可以选择所需的转换类型以及是否舍入。
答案 1 :(得分:0)
我无法100%使其与脚本兼容,但是因为找到了可靠的解决方案,我只需要在数字之间输入一个字符,例如,,而且我能够将它拉开。
所以从技术上讲,我不需要任何其他答案了!