В моей программе на C ++ мне нужно знать, является ли переменная Lua целым числом или числом с плавающей запятой. C API обеспечивает lua_isnumber()
но эта функция не различает int/float/double
,
До сих пор я работал над этим с помощью modf()
:
if (lua_isnumber(luaCtx, -1)) // int / unsigned int / float:
{
luaVarName = lua_tostring(luaCtx, -2);
double n = static_cast<double>(lua_tonumber(luaCtx, -1));
// Figure out if int or float:
double fractPart, intPart;
fractPart = modf(n, &intPart);
if (fractPart != 0.0)
{
luaVarType = ScriptVar::TypeTag::Float;
luaVarData.asFloat = static_cast<float>(n);
}
else
{
luaVarType = ScriptVar::TypeTag::Integer;
luaVarData.asInteger = static_cast<int>(n);
}
}
Предоставляет ли Lua API способ более точного определения типа переменной?
double n = lua_tonumber(L, -1);
if (n == (int)n) {
// n is an int
} else {
// n is a double
}
Этот код просто проверяет, есть ли у n десятичные дроби или нет.
Если n равно 1,5, то приведение его к int ((int) n) приведет к значению 1, поэтому:
1.5 == 1 неверно, n двойное
Но если n это скажем 4:
4 == 4 верно, n является целым
Это работает, потому что для lua единственное числовое число, которое существует, это double. Таким образом, при преобразовании числа из lua в C мы можем использовать int, если число является целым числом (целым числом).