Как преобразовать строки в двойные числа в C++ с помощью stringstream

Я пытаюсь взять строки из векторов и преобразовать их в двойные с помощью stringstream. Однако, когда я запускаю этот код:

  double tempDob;
  stringstream ss;
  ss << tempVec[3];
  ss >> tempDob;

Я получаю странные вещи вместо обычного двойника. Вот пример: Исходные строки (cout of tempVec[3]):

        15000000
62658722.54
91738635.67
        20
        29230756.5
        12

Преобразованные двойники (cout of tempDob):

1.5e+07
6.26587e+07
9.17386e+07
2.92308e+07
4.70764e+07
3.53692e+07

Как я могу правильно преобразовать эти строки в двойные через stringstream? Спасибо!


person James Hall    schedule 11.12.2016    source источник
comment
Лучше опубликуйте минимально воспроизводимый пример.   -  person juanchopanza    schedule 12.12.2016
comment
Вы понимаете, что 15000000 равно 1.5e+07; второе равно 1,5, умноженному на 10 в степени 7.   -  person Ken Y-N    schedule 12.12.2016


Ответы (2)


Так:

istringstream is( somestring );
double d;
is >> d;

хотя, конечно, ваш собственный код будет иметь обработку ошибок.

person Community    schedule 11.12.2016
comment
И это делает что на самом деле? - person πάντα ῥεῖ; 12.12.2016
comment
Точность и как сделать форматирование под вопросом? - person πάντα ῥεῖ; 12.12.2016
comment
@ πάντα ῥεῖ Он преобразует первый токен, разделенный пробелами, в некоторую строку, если это возможно. - person ; 12.12.2016
comment
Спасибо за ссылку на другой вопрос, теперь я знаю, что это дает мне научную запись. Я попытался исправить это с помощью fix, но это все равно дало мне научную нотацию: - person James Hall; 12.12.2016
comment
стрингстрим сс; ss ‹‹ фиксированный ‹‹ tempVec[3]; двойной д; сс ›› фиксированный ›› д; - person James Hall; 12.12.2016
comment
@James Проблема не в чтении двойника из строки, как следует из заголовка вашего вопроса, а в его форматировании после прочтения. Итак, как только вы прочитали d, вам нужно что-то вроде cout ‹‹ fixed ‹‹ d; - person ; 12.12.2016
comment
@JamesHall Двойник не содержит информации о форматировании. Так что ss >> fixed >> d не может сделать ничего полезного. Вы просто читаете обычный двойник из потока, который совершенно не обращает внимания на научную нотацию. Нотация вступает в игру только тогда, когда вы снова форматируете двойник как строку, например, во время вывода через cout. - person Felix Dombek; 12.12.2016
comment
Спасибо, парни! Я понял теперь - person James Hall; 12.12.2016

Вы можете повторно использовать один и тот же поток строк следующим образом:

std::vector<std::string> theVec { "        15000000",
                                  "62658722.54",
                                  "91738635.67",
                                  "        20",
                                  "        29230756.5",
                                  "        12" };
std::stringstream ss;
for (auto const& s : theVec)
{
    ss.clear();
    ss.str(s);
    double d;
    ss >> d;
    std::cout << d << "\n";
}
person Felix Dombek    schedule 11.12.2016
comment
Спасибо, приятно знать. На этот раз, хотя я использую его в цикле for с ss.clear() - person James Hall; 12.12.2016
comment
@JamesHall ss.clear() необходим, я добавил его, но обратите внимание, что он очищает не строку, а только флаги. Это отличается от std::string::clear и т. д. - person Felix Dombek; 12.12.2016