Przeglądaj źródła

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

Wendal Chen 3 lat temu
rodzic
commit
eceb2b1264
2 zmienionych plików z 51 dodań i 112 usunięć
  1. 44 112
      components/lua-cjson/lua_cjson.c
  2. 7 0
      demo/json/main.lua

+ 44 - 112
components/lua-cjson/lua_cjson.c

@@ -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);
-	}
+    // int top = lua_gettop(L);
+    if (lua_isnil(L, 1)) {
+        lua_pushnil(L);
+        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_insert(L, 1);
-    int status = lua_pcall(L, top, 1, 0);
+    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_insert(L, 1);
+        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

+ 7 - 0
demo/json/main.lua

@@ -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)