Преобразовать double в строку с помощью boost:: lexical_cast в С++?

Я хотел бы использовать lexical_cast для преобразования float в строку. Обычно он работает нормально, но у меня есть некоторые проблемы с числами без десятичных знаков. Как я могу исправить число десятичных знаков, показанное в строке?

Пример:

double n=5;
string number;
number = boost::lexical_cast<string>(n);

Номер результата 5, мне нужен номер 5.00.

Ответ 1

Из документации для повысить lexical_cast:

Для более значимых преобразований, например, когда точность или форматирование требуют более жесткого контроля, чем предлагается поведением lexical_cast по умолчанию, рекомендуется использовать обычный подход с строковым потоком. Если числа конверсий являются числовыми и числовыми, numeric_cast может предложить более разумное поведение, чем lexical_cast.

Пример:

#include <sstream>
#include <iomanip>

int main() {
    std::ostringstream ss;
    double x = 5;
    ss << std::fixed << std::setprecision(2);
    ss << x;
    std::string s = ss.str();
    return 0;
}

Ответ 2

Посмотрите на boost:: format library. Он объединяет удобство использования printf с типом безопасности потоков. Для скорости я не знаю, но я сомневаюсь, что это действительно важно в наши дни.

#include <boost/format.hpp>
#include <iostream>

int main()
{
   double x = 5.0;
   std::cout << boost::str(boost::format("%.2f") % x) << '\n';
}

Ответ 3

Если вам нужно сложное форматирование, используйте std::ostringstream вместо этого. boost::lexical_cast предназначен для "простого форматирования".

std::string
get_formatted_value(double d) {
    std::ostringstream oss;
    oss.setprecision(3);
    oss.setf(std::ostringstream::showpoint);
    oss << d;
    return oss.str();
}

Ответ 4

вы также можете использовать sprintf, который быстрее, чем ostringstream

#include <cstdio>
#include <string>

using namespace std;

int main()
{
    double n = 5.0;

    char str_tmp[50];
    sprintf(str_tmp, "%.2f", n); 
    string number(str_tmp);
}