Dre*_*kes 3 c++ json rapidjson
有没有办法控制使用rapidjson生成的JSON中的输出精度?
例如:
writer.String("length");
writer.Double(1.0 / 3.0);
Run Code Online (Sandbox Code Playgroud)
这会产生类似于:
{ length: 0.33333333 }
Run Code Online (Sandbox Code Playgroud)
我发送了很多值,只需要两个小数位就可以得到几个值.
从消息来源
Writer& Double(double d)
{
Prefix(kNumberType);
WriteDouble(d);
return *this;
}
//! \todo Optimization with custom double-to-string converter.
void WriteDouble(double d) {
char buffer[100];
#if _MSC_VER
int ret = sprintf_s(buffer, sizeof(buffer), "%g", d);
#else
int ret = snprintf(buffer, sizeof(buffer), "%g", d);
#endif
RAPIDJSON_ASSERT(ret >= 1);
for (int i = 0; i < ret; i++)
stream_.Put(buffer[i]);
}
Run Code Online (Sandbox Code Playgroud)
对于
g具有样式e或f将要执行的转换样式转换.
f:Precision指定小数点字符后出现的最小位数.默认精度为6.
从这里引用
有变种,编写新Writer类并编写自己的Double函数实现.
最后一个案例的简单例子
template<typename Stream>
class Writer : public rapidjson::Writer<Stream>
{
public:
Writer(Stream& stream) : rapidjson::Writer<Stream>(stream)
{
}
Writer& Double(double d)
{
this->Prefix(rapidjson::kNumberType);
char buffer[100];
int ret = snprintf(buffer, sizeof(buffer), "%.2f", d);
RAPIDJSON_ASSERT(ret >= 1);
for (int i = 0; i < ret; ++i)
this->stream_.Put(buffer[i]);
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
用法如
int main()
{
const std::string json =
"{"
"\"string\": 0.3221"
"}";
rapidjson::Document doc;
doc.Parse<0>(json.c_str());
rapidjson::FileStream fs(stdout);
Writer<rapidjson::FileStream> writer(fs);
doc.Accept(writer);
}
Run Code Online (Sandbox Code Playgroud)
结果:{"string":0.32}
当然如果你Writer手动使用,你可以Double用精度参数编写函数.
小智 5
对于任何偶然发现这种情况的人,此方法已于 2016 年 2 月 11 日添加到 rapidjson 中:
rapidjson::Writer::SetMaxDecimalPlaces(int maxDecimalPlaces)
提供的默认 Writer 类比此处的其他答案更完整,并且应始终使用,除非您有非常具体的需求。
| 归档时间: |
|
| 查看次数: |
3343 次 |
| 最近记录: |