问题
Is there a way to control the output precision in JSON generated using rapidjson?
For example:
writer.String("length");
writer.Double(1.0 / 3.0);
This generates something like:
{ length: 0.33333333 }
I'm sending a lot of values and only need two decimal places for several values.
回答1:
From sources
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]);
}
For the
gconversion style conversion with styleeorfwill be performed.
f: Precision specifies the minimum number of digits to appear after the decimal point character. The default precision is6.
quotes from here
There is variant, to write new Writer class and write your own Double function realisation.
Simple example of last case
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;
}
};
usage like
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);
}
result: {"string":0.32}
Of course if you use Writer manually, you can writer function Double with precision parameter.
来源:https://stackoverflow.com/questions/16104558/set-floating-point-precision-using-rapidjson