Конвертировать double в строку, используя boost :: lexical_cast в C ++? - PullRequest
14 голосов
/ 16 февраля 2011

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

Пример:

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

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

Ответы [ 4 ]

29 голосов
/ 16 февраля 2011

Из документации для boost 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;
}
13 голосов
/ 06 февраля 2014

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

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

int main()
{
   double x = 5.0;
   std::cout << boost::str(boost::format("%.2f") % x) << '\n';
}
3 голосов
/ 16 февраля 2011

Если вам нужно сложное форматирование, используйте 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();
}
1 голос
/ 16 февраля 2011

вы также можете использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...