I’m trying to abbreviate numbers in my game (like 10k, 10m) because the numbers will go off the screen if they are too big. I can’t find any solution to this Anyone able to help?
I have a script, hope it helps!
-- if it is a Gui Then
local TextLabel = pathwayto.TextLabel
local abbreviations = {
N = 10^30;
O = 10^27;
Sp = 10^24;
Sx = 10^21;
Qn = 10^18;
Qd = 10^15;
T = 10^12;
B = 10^9;
M = 10^6;
K = 10^3
}
function abbreviateNums(number)
local abbreviatedNum = number
local abbreviationChosen = 0
for abbreviation, num in pairs(abbreviations) do
if number >= num and num > abbreviationChosen then
local shortNum = number / num
local intNum = math.floor(shortNum)
abbreviatedNum = tostring(intNum) .. abbreviation .. "+"
abbreviationChosen = num
end
end
return abbreviatedNum
end
game:GetService("RunService").RenderStepped:Connect(function()
TextLabel.Text = abbreviateNums(TextLabel.Text)
end)
2 Likes
You can use math.floor(math.log(x,10^3))
to give you an index of the abbreviation instead of iterating through all of the abbreviations.
2 Likes
I get the error
Players.Towren.PlayerGui.StatValueGUI.ShardsValue.ShardValue.LocalScript:26: attempt to compare number <= string
Can you give me the script you’re currently editing?
-- if it is a Gui Then
local TextLabel = script.Parent
local abbreviations = {
N = 10^30;
O = 10^27;
Sp = 10^24;
Sx = 10^21;
Qn = 10^18;
Qd = 10^15;
T = 10^12;
B = 10^9;
M = 10^6;
K = 10^3
}
function abbreviateNums(number)
local abbreviatedNum = number
local abbreviationChosen = 0
for abbreviation, num in pairs(abbreviations) do
if number >= num and num > abbreviationChosen then
local shortNum = number / num
local intNum = math.floor(shortNum)
abbreviatedNum = tostring(intNum) .. abbreviation .. "+"
abbreviationChosen = num
end
end
return abbreviatedNum
end
while wait() do
TextLabel.Text = game.Players.LocalPlayer.leaderstats.Shards.Value
TextLabel.Text = abbreviateNums(TextLabel.Text)
end
-- if it is a Gui Then
local Value = game.Players.LocalPlayer.leaderstats.Shards
local TextLabel = script.Parent
local abbreviations = {
N = 10^30;
O = 10^27;
Sp = 10^24;
Sx = 10^21;
Qn = 10^18;
Qd = 10^15;
T = 10^12;
B = 10^9;
M = 10^6;
K = 10^3
}
function abbreviateNums(number)
local abbreviatedNum = number
local abbreviationChosen = 0
for abbreviation, num in pairs(abbreviations) do
if number >= num and num > abbreviationChosen then
local shortNum = number / num
local intNum = math.floor(shortNum)
abbreviatedNum = tostring(intNum) .. abbreviation .. "+"
abbreviationChosen = num
end
end
return abbreviatedNum
end
TextLabel.Text = abbreviateNums(Value.Value)
Value.Changed:Connect(function()
TextLabel.Text = abbreviateNums(Value.Value)
end)
7 Likes
local abbreviations = {"K","M","B","T","Qd","Qn","Sx","Sp","O","N"}
function abbreviateNumber(number)
local abbreviationIndex = math.floor(math.log(number,1000))
local abbreviation = abbreviations[abbreviationIndex]
if abbreviation then
local shortNum = number/(1000^abbreviationIndex)
local intNum = math.floor(shortNum)
local str = intNum .. abbreviation
if intNum < shortNum then
str = str .. "+"
end
return str
else
return tostring(number)
end
end
2 Likes
Actually, Miners Haven was open sourced a while back, and a useful module exactly for this was made.
I believe line 113 is the beginning of the code you are looking for.
Code if you don't want to go to github.
local function shorten(Input)
local Negative = Input < 0
Input = math.abs(Input)
local Paired = false
for i,v in pairs(MoneyLib.Suffixes) do
if not (Input >= 10^(3*i)) then
Input = Input / 10^(3*(i-1))
local isComplex = (string.find(tostring(Input),".") and string.sub(tostring(Input),4,4) ~= ".")
Input = string.sub(tostring(Input),1,(isComplex and 4) or 3) .. (MoneyLib.Suffixes[i-1] or "")
Paired = true
break;
end
end
if not Paired then
local Rounded = math.floor(Input)
Input = tostring(Rounded)
end
if Negative then
return "-"..Input
end
return Input
end
1 Like