Из источников
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]);
}
Для преобразования стиля g
преобразования со стилем e
или f
будет выполняться.
f
: Точность указывает минимальное количество цифр, которое должно появляться после символа десятичной точки. По умолчанию используется 6
.
цитаты из here
Существует вариант, чтобы написать новый 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;
}
};
использование как
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);
}
результат: { "строка": 0,32}
Конечно, если вы используете Writer
вручную, вы можете функции писатель Double
с параметром точности.
Похоже, что это невозможно. Для этой функции я открыл [запрос функции] (https://code.google.com/p/rapidjson/issues/detail?id=67). –