Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

bad argument #1 to 'gsub' (string expected, got user data), why?

This script is to add commas in the number for cash, yet it always returns as a bad argument.

Here's the code:

function addComma(n)
    local f,k = n
    while (true) do
        f,k = string.gsub(f,"^(-?%d+)(%d%d%d)","%1,%2")
        if (k == 0) then break end
    end
    return f
end

It breaks on line 4 saying: bad argument #1 to 'gsub' (string expected, got userdata)

Can someone help me with this?

This is the entire code, which is inside a TextLabel

wait(1.2)

local plr=script.Parent.Parent.Parent.Parent.Parent
local stats=plr:FindFirstChild('leaderstats')
local dollars2=stats:FindFirstChild('Money')


function addComma(n)
	local f,k = n
	while (true) do
		f,k = string.gsub(f,"^(-?%d+)(%d%d%d)","%1,%2")
		if (k == 0) then break end
	end
	return f
end

function force_decimal_places(num, places)
	if type(num) ~= 'number' or type(places) ~= 'number' then
		return 'NaN' --not a number
	end
	local mult = 10^(places or 0) --set up rounding places
	num = tostring( math.floor(num * mult + 0.5) / mult ) --round
	local dot = string.find(num, '%.')
	if not dot then --easily add zeros to an integer
		num = num..'.'..string.rep('0', places)
	else --some after decimal?
		local after = string.sub(num, dot + 1)
		if after ~= places then --if it doesn't already round to exact places
			num = num..string.rep('0', places - #after)
		end
	end

	return num --returns a string (otherwise the zeros would get truncated)
end

while wait(0.1) do
	dollars2 = addComma(dollars2)
local dollars = force_decimal_places(dollars2.Value, 2)
script.Parent.Text = '$'..dollars 
end

2 answers

✓ Accepted answer

If you try to set dollars2 to the value returned by addComma, you lose the reference to the Money ValueObject, breaking the script.

addComma expects a string. First, you set f = n on the first line. Then, you call gsub on f. If f isn't a string, this doesn't work.

Additionally, force_decimal_places expects a number, since you perform math on it. To fix these, you need to change your loop:

while wait(.1) do
	local dollars = force_decimal_places(dollars2.Value, 2)
	dollars = addComma(dollars)

	script.Parent.Text = "$" .. dollars
end

Or, more compactly and efficiently:

function fixText()
	script.Parent.Text = "$" .. addComma(force_decimal_places(dollar2.Value, 2))
end
dollars2.Changed:connect(fixText)
fixText()

f is dollars, since that's the parameter you passed. dollars2 is a userdata, as it says. That means it's a ROBLOX object.

Instead, use addComma( tostring(dollars2.Value) ) to get the value of that object, and apply string processing to it. I'm unsure why you'd overwrite the dollars2 variable with that string, though, since that will prevent the value from updating in the future.

2 comments

0

The line breaks at the 4th line of function addComma(n)

0

Yes, because f is n which is dollars2. You should instead call it with tostring(dollars2.Value) so that n and f are strings.

This discussion is preserved as it was. New answers, comments, and votes are closed.