Set floating point precision using rapidjson

北城余情 提交于 2019-12-06 08:22:27

问题


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 g conversion style conversion with style e or f will be performed.

f: Precision specifies the minimum number of digits to appear after the decimal point character. The default precision is 6.

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!