Преобразование чисел с плавающей точкой в ​​форматированную строку - PullRequest
2 голосов
/ 11 октября 2011

Я пытаюсь преобразовать число double в std::string, преобразование должно быть напечатано либо в десятичном формате с двумя десятичными цифрами, либо в экспоненциальной форме:

  1. 1 -> 1,00
  2. 0,1 -> 0,10
  3. 0,01 -> 0,01
  4. 0,015 -> 1,5e-2
  5. 10 -> 10,00
  6. 100 -> 100,00
  7. 15000 -> 1,5e4

Я пытался использовать функцию boost::format с типом %g, но, хотя можно установить количество значащих цифр, невозможно установить количество напечатанных цифр после десятичной точки:

  1. 1 -> 1
  2. 0,1 -> 0,1
  3. 0,01 -> 0,01
  4. 10 -> 10
  5. 100 -> 100

Есть ли лучший способ сделать этот тип преобразования / форматирования? Я бы предпочел использовать Стандартную библиотеку или Boost.

Ответы [ 6 ]

4 голосов
/ 11 октября 2011

Выберите scientific или fixed в зависимости от размера номера.

Это так просто.

Приветствия и hth.,

3 голосов
/ 11 октября 2011

Повышение не требуется, хотя должен быть способ сделать это с boost::format или sprintf, если хотите.

#include <iostream>
#include <iomanip>

int main()
{
    std::string numStr("3.14159265");
    double num(atof(numStr.c_str()));
    std::cout
        << std::setprecision(2) 
        << std::scientific << num
        << std::fixed << num;
    return 0;
}

Редактировать: Неправильно читать вопрос, если вы хотите перейти от double к std::string Я бы использовал std::ostringstream, который поддерживает те же манипуляторы iostream и оператор вставки. Затем вы можете позвонить str(), чтобы получить из него строку.

1 голос
/ 11 октября 2011

Вы можете использовать ostringstream, вот так

#include <sstream>
#include <string>

std::string FloatToString(float fNumber)
{
    std::ostringstream os;

    os << fNumber;

    return os.str();
}
0 голосов
/ 11 октября 2011

sprintf ();должно быть легко помочь вам печатать double в массив string / char.

0 голосов
/ 11 октября 2011

Обычный старый C sprintf поддерживает количество десятичных знаков, например, так: "% .3g"

Вы можете легко преобразовать вывод char * в std :: string.

0 голосов
/ 11 октября 2011

Я не уверен, что это то, что вы ищете, но ... Вы можете контролировать количество напечатанных цифр, используя cout, с помощью функции setprecision.

#include <iomanip>
#include <iostream>
using namespace std;

int main()
{
  double d = 123123.23234234;
  cout << setprecision(15) << d;
  system("pause");
  return 0;
}
...