1
0
mirror of https://gitee.com/openLuat/LuatOS synced 2025-08-17 22:18:03 +08:00

fix: json.encode浮点数格式设置无效 https://gitee.com/openLuat/LuatOS/issues/I64IQL

This commit is contained in:
Wendal Chen 2022-12-04 23:21:53 +08:00
parent f1baffc448
commit eceb2b1264
2 changed files with 53 additions and 114 deletions

View File

@ -63,6 +63,8 @@
//#include <lrodefs.h>
//#include <auxmods.h>
static char float_fmt[12];
#ifdef WIN32
#define snprintf _snprintf
typedef unsigned char u_char;
@ -559,12 +561,12 @@ static void json_append_array(lua_State *l, int current_depth,
strbuf_append_char(json, ']');
}
typedef struct {
char encode_number_precision_mode; /*浮点数转化模式 默认为'g',可配置为'f' */
unsigned char encode_number_precision; /*浮点数转化精度 默认为7,可配置为0~14 */
} json_easy_config_t;
// typedef struct {
// char encode_number_precision_mode; /*浮点数转化模式 默认为'g',可配置为'f' */
// unsigned char encode_number_precision; /*浮点数转化精度 默认为7,可配置为0~14 */
// } json_easy_config_t;
static json_easy_config_t json_easy_config = {'g',DEFAULT_ENCODE_NUMBER_PRECISION};
// static json_easy_config_t json_easy_config = {'g',DEFAULT_ENCODE_NUMBER_PRECISION};
static void json_append_number(lua_State *l,
strbuf_t *json, int lindex)
@ -600,15 +602,15 @@ static void json_append_number(lua_State *l,
len = snprintf_(strbuf_empty_ptr(json), FPCONV_G_FMT_BUFSIZE, "%ld", lua_tointeger(l, lindex));
}
else {
//len = snprintf_("%f", strbuf_empty_ptr(json), FPCONV_G_FMT_BUFSIZE, lua_tonumber(l, lindex));
if (json_easy_config.encode_number_precision_mode == 'f')
{
len = fpconv_f_fmt(strbuf_empty_ptr(json), num, json_easy_config.encode_number_precision);
}
else
{
len = fpconv_g_fmt(strbuf_empty_ptr(json), num, json_easy_config.encode_number_precision);
}
len = snprintf_(strbuf_empty_ptr(json), FPCONV_G_FMT_BUFSIZE, float_fmt, lua_tonumber(l, lindex));
// if (json_easy_config.encode_number_precision_mode == 'f')
// {
// len = fpconv_f_fmt(strbuf_empty_ptr(json), num, json_easy_config.encode_number_precision);
// }
// else
// {
// len = fpconv_g_fmt(strbuf_empty_ptr(json), num, json_easy_config.encode_number_precision);
// }
}
//len = fpconv_g_fmt(strbuf_empty_ptr(json), num, DEFAULT_ENCODE_NUMBER_PRECISION);
strbuf_extend_length(json, len);
@ -1390,111 +1392,40 @@ json.encode(obj)-->浮点数用%.7g的方式转换为字符串
json.encode(obj,"12f")-->%.12f
*/
static int l_json_encode_safe(lua_State *L) {
int top = lua_gettop(L);
if(top <= 1)
{
json_easy_config.encode_number_precision = DEFAULT_ENCODE_NUMBER_PRECISION;
json_easy_config.encode_number_precision_mode = 'g';
}
else{
size_t len;
int prec = 0;
const char* mode = luaL_optlstring(L, top, "7g",&len);
for(int i = 0; i<len+1; i++)
{
if( *(mode+i) >= '0' && *(mode+i) <= '9' )
{
prec *= 10;
prec += *(mode+i)-'0';
}
else
{
if(*(mode+i) == 'f')
{
json_easy_config.encode_number_precision_mode = *(mode+i);
}
else
{
json_easy_config.encode_number_precision_mode = 'g';
}
break;
}
}
if (prec>=0 && prec<=14)
{
json_easy_config.encode_number_precision = prec;
}
else
{
json_easy_config.encode_number_precision = DEFAULT_ENCODE_NUMBER_PRECISION;
}
--top;
lua_settop(L,top);
}
lua_pushcfunction(L, json_encode);
lua_insert(L, 1);
int status = lua_pcall(L, top, 1, 0);
if (status != LUA_OK) {
// int top = lua_gettop(L);
if (lua_isnil(L, 1)) {
lua_pushnil(L);
lua_insert(L, 1);
lua_pushliteral(L, "obj is nil");
return 1;
}
memcpy(float_fmt, "%.7g", strlen("%.7g") + 1);
size_t len = 0;
int prec = 0;
char buff[6] = {0};
if (lua_isstring(L, 2)) {
const char* mode = luaL_checklstring(L, 2, &len);
//LLOGD("json format ? %s", mode);
if (len > 1 && len < 8 && (mode[len - 1] == 'g' || mode[len - 1] == 'f')) {
if (mode[0] == '%') {
memcpy(float_fmt, mode, len + 1);
}
else {
memcpy(float_fmt + 2, mode, len + 1);
}
}
}
//LLOGD("float_fmt [%s]", float_fmt);
lua_pushcfunction(L, json_encode);
lua_pushvalue(L, 1);
int status = lua_pcall(L, 1, 1, 0);
if (status != LUA_OK) {
const char* err = lua_tostring(L, -1);
lua_pushnil(L);
lua_pushstring(L, err);
return 2;
}
return 1;
}
// /*
// 设置encode数字精度和模式
// @api json.encode_number_precision
// @param string 浮点数精度和模式,这项不存在的时候,为默认值"7g",数字只支持"0~14",模式只支持"f/g"
// @return nil 无返回值
// @usage
// json.encode_number_precision()-->浮点数用%.7g的方式转换为字符串
// json.encode_number_precision("2")-->浮点数用%.2g的方式转换为字符串
// json.encode_number_precision("10f")-->浮点数用%.10f的方式转换为字符串
// */
// static int l_json_cfg_encode_number_precision(lua_State *L) {
// int top = lua_gettop(L);
// if(top <= 0)
// {
// json_easy_config.encode_number_precision = DEFAULT_ENCODE_NUMBER_PRECISION;
// json_easy_config.encode_number_precision_mode = 'g';
// }
// else{
// size_t len;
// int prec = 0;
// const char* mode = luaL_optlstring(L, top, "7g",&len);
// for(int i = 0; i<len+1; i++)
// {
// if( *(mode+i) >= '0' && *(mode+i) <= '9' )
// {
// prec *= 10;
// prec += *(mode+i)-'0';
// }
// else
// {
// if(*(mode+i) == 'f')
// {
// json_easy_config.encode_number_precision_mode = *(mode+i);
// }
// else
// {
// json_easy_config.encode_number_precision_mode = 'g';
// }
// break;
// }
// }
// if (prec>=0 && prec<=14)
// {
// json_easy_config.encode_number_precision = prec;
// }
// else
// {
// json_easy_config.encode_number_precision = DEFAULT_ENCODE_NUMBER_PRECISION;
// }
// --top;
// lua_settop(L,top);
// }
// return 0;
// }
/*
@ -1592,6 +1523,7 @@ static int lua_cjson_new(lua_State *l)
int luaopen_cjson(lua_State *l)
{
memcpy(float_fmt, "%.7g", strlen("%.7g") + 1);
lua_cjson_new(l);
// #ifdef ENABLE_CJSON_GLOBAL

View File

@ -35,6 +35,13 @@ sys.taskInit(function()
t.abc[1] = 345
-- 输出的内容是 {"abc":{"1":345,"def":"123"}}
log.info("json", "encode2", json.encode(t))
-- 浮点数演示
-- 默认%.7g
log.info("json", json.encode({abc=1234.300}))
-- 限制小数点到1位
log.info("json", json.encode({abc=1234.300}, "1f"))
end
end)