Преобразовать 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);
}