diff --git a/lstrlib.c b/lstrlib.c index 563d5ca5..8c9e1a83 100644 --- a/lstrlib.c +++ b/lstrlib.c @@ -1227,16 +1227,14 @@ static int str_format (lua_State *L) { nb = lua_number2strx(L, buff, maxitem, form, luaL_checknumber(L, arg)); break; - case 'e': case 'E': case 'f': - case 'g': case 'G': { + case 'f': + maxitem = MAX_ITEMF; /* extra space for '%f' */ + buff = luaL_prepbuffsize(&b, maxitem); + /* FALLTHROUGH */ + case 'e': case 'E': case 'g': case 'G': { lua_Number n = luaL_checknumber(L, arg); - if (*(strfrmt - 1) == 'f' && l_mathop(fabs)(n) >= 1e100) { - /* 'n' needs more than 99 digits */ - maxitem = MAX_ITEMF; /* extra space for '%f' */ - buff = luaL_prepbuffsize(&b, maxitem); - } addlenmod(form, LUA_NUMBER_FRMLEN); - nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); + nb = snprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); break; } case 'p': { diff --git a/testes/strings.lua b/testes/strings.lua index 2540fdef..0e7874bf 100644 --- a/testes/strings.lua +++ b/testes/strings.lua @@ -255,6 +255,12 @@ do -- longest number that can be formatted local s = string.format('%.99f', -(10^i)) assert(string.len(s) >= i + 101) assert(tonumber(s) == -(10^i)) + + -- limit for floats + assert(10^38 < math.huge) + local s = string.format('%.99f', -(10^38)) + assert(string.len(s) >= 38 + 101) + assert(tonumber(s) == -(10^38)) end