自定义结构体转jsonStr的时候 打印出来的浮点值会有科学计数法的后缀E0
zyx199518 opened this issue · 7 comments
zyx199518 commented
版本:v1.0.3
程序内部是:
double test = 2.011111;
iguana::to_json后打印出来:
{ "test": 2.011111E0}
qicosmos commented
这样问题不大吧,能正确反序列化就行。
zyx199518 commented
能否加一个控制浮点数有效数字的接口? 同时能够配置是否按照科学计数法显示?
zyx199518 commented
我们需要把序列化的浮点结果写到日志里面,需要控制打印的位数
bbbgan commented
我们需要把序列化的浮点结果写到日志里面,需要控制打印的位数
打算提供一个接口,让用户可以自定义使用浮点数序列化,今天晚一点提PR
zyx199518 commented
重载to_chars_float, 看上去编译完后buffer的位数已经确定, 后续有没有可能支持动态指定的方式,类似
StructData data;
std::string jsonStr
int floatPrecision = 5;
iguana::to_json(data, jsonStr, precision);
或者 其他能够基于当前代码实现的方案?
bbbgan commented
那个buffer并不是实际的位数,只是最大容量,64位double + 一个结束字符 = 65。
目前如果希望做到动态的,最简单的方案是借助全局变量吧。
代码未测试,大概如下:
int floatPrecision = 5;
int doublePrecision = 10;
template <typename T>
inline char* to_chars_float(T value, char* buffer) {
static_assert(std::is_floating_point<T>::value, "floating-point type needed");
char format[16];
if (std::is_same<T, float>::value) {
std::snprintf(format, sizeof(format), "%%.%dg", floatPrecision);
} else {
std::snprintf(format, sizeof(format), "%%.%dg", doublePrecision);
}
int length = std::snprintf(buffer, 65, format, value);
if (length == 0) {
// throw
}
return buffer + length;
}