2013-04-19 3 views
3

Есть ли способ контролировать точность вывода в JSON, сгенерированном с помощью функции fastjson?Установить точность с плавающей запятой, используя rapidjson

Например:

writer.String("length"); 
writer.Double(1.0/3.0); 

Это создает что-то вроде:

{ length: 0.33333333 } 

Я посылаю много значений и нужно только два знака после запятой для нескольких значений.

+0

Похоже, что это невозможно. Для этой функции я открыл [запрос функции] (https://code.google.com/p/rapidjson/issues/detail?id=67). –

ответ

6

Из источников

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 с параметром точности.

+0

Спасибо. Похоже, тогда это невозможно. Я рад добавить перегрузку в свой API, поэтому сделаю это на основе ваших предложений. –

Смежные вопросы