как атой но плавать - PullRequest
       67

как атой но плавать

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

Существует ли функция, аналогичная atoi, которая преобразует строку в число с плавающей точкой вместо целого числа?

Ответы [ 11 ]

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

atof ()

(или std::atof() говорит на C ++ - спасибо jons34yp )

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

Преобразование строки в любой тип (это конструируемый по умолчанию и потоковый):

template< typename T >
T convert_from_string(const std::string& str)
{
  std::istringstream iss(str);
  T result;
  if( !(iss >> result) ) throw "Dude, you need error handling!";
  return result;
}
17 голосов
/ 16 февраля 2011
boost::lexical_cast<float>(str);

Эта шаблонная функция включена в популярную коллекцию Boost библиотек, о которой вам стоит узнать, если вы серьезно относитесь к C ++.

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

В качестве альтернативы уже упомянутым std::strtof() и boost::lexical_cast<float>(), новый стандарт C ++ представил

float stof(const string& str, size_t *idx = 0);
double stod(const string& str, size_t *idx = 0);
long double stold(const string& str, size_t *idx = 0);

для проверки ошибок преобразования строки в число с плавающей точкой. И GCC, и MSVC поддерживают их (не забудьте #include <string>)

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

strtof

Со страницы man

Функции strtod (), strtof () и strtold () преобразуют начальную часть строки, на которую указывает nptr, в double,float и long double представление, соответственно.

Ожидаемая форма (начальная часть) строки - необязательный начальный пробел, распознаваемый isspace (3), необязательный плюс ('' + '')или знак минус ('' - ''), а затем либо (i) десятичное число, либо (ii) шестнадцатеричное число, либо (iii) бесконечность, либо (iv) NAN (не число).

/ man page>

atof преобразует строку в double (не как число с плавающей запятой, как следует из названия).

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

Это также будет работать (но с кодом C):

#include <iostream>

using namespace std;

int main()
{
float myFloatNumber = 0;
string inputString = "23.2445";
sscanf(inputString.c_str(), "%f", &myFloatNumber);
cout<< myFloatNumber * 100;

}

См. Здесь: http://codepad.org/qlHe5b2k

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

Предпочитают strtof(). atof() не обнаруживает ошибок.

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

Использование atof из stdlib.h:

double atof ( const char * str );
0 голосов
/ 16 февраля 2011

Попробуйте boost :: spirit: быстро, безопасно для типов и очень эффективно:

std::string::iterator begin = input.begin();
std::string::iterator end = input.end();
using boost::spirit::float_;

float val;
boost::spirit::qi::parse(begin,end,float_,val);
0 голосов
/ 16 февраля 2011

В качестве альтернативы всему вышесказанному вы можете использовать строковый поток. http://cplusplus.com/reference/iostream/stringstream/

...