Как преобразовать строку в double в С++? Я хочу функцию, которая возвращает 0, когда строка не является числовой.
Как преобразовать строку в double в С++?
Ответ 1
См. С++ FAQ Lite Как преобразовать std::string в число?
См. С++ Super-FAQ Как преобразовать std::string в число?
Обратите внимание, что в соответствии с вашими требованиями вы не можете отличить все разрешенные представления строк от нуля от числовых строк.
// the requested function
#include <sstream>
double string_to_double( const std::string& s )
{
std::istringstream i(s);
double x;
if (!(i >> x))
return 0;
return x;
}
// some tests
#include <cassert>
int main( int, char** )
{
// simple case:
assert( 0.5 == string_to_double( "0.5" ) );
// blank space:
assert( 0.5 == string_to_double( "0.5 " ) );
assert( 0.5 == string_to_double( " 0.5" ) );
// trailing non digit characters:
assert( 0.5 == string_to_double( "0.5a" ) );
// note that with your requirements you can't distinguish
// all the the allowed string representation of zero from
// the non numerical strings:
assert( 0 == string_to_double( "0" ) );
assert( 0 == string_to_double( "0." ) );
assert( 0 == string_to_double( "0.0" ) );
assert( 0 == string_to_double( "0.00" ) );
assert( 0 == string_to_double( "0.0e0" ) );
assert( 0 == string_to_double( "0.0e-0" ) );
assert( 0 == string_to_double( "0.0e+0" ) );
assert( 0 == string_to_double( "+0" ) );
assert( 0 == string_to_double( "+0." ) );
assert( 0 == string_to_double( "+0.0" ) );
assert( 0 == string_to_double( "+0.00" ) );
assert( 0 == string_to_double( "+0.0e0" ) );
assert( 0 == string_to_double( "+0.0e-0" ) );
assert( 0 == string_to_double( "+0.0e+0" ) );
assert( 0 == string_to_double( "-0" ) );
assert( 0 == string_to_double( "-0." ) );
assert( 0 == string_to_double( "-0.0" ) );
assert( 0 == string_to_double( "-0.00" ) );
assert( 0 == string_to_double( "-0.0e0" ) );
assert( 0 == string_to_double( "-0.0e-0" ) );
assert( 0 == string_to_double( "-0.0e+0" ) );
assert( 0 == string_to_double( "foobar" ) );
return 0;
}
Ответ 2
Самый простой способ - использовать boost:: lexical_cast:
double value;
try
{
value = boost::lexical_cast<double>(my_string);
}
catch (boost::bad_lexical_cast const&)
{
value = 0;
}
Ответ 3
atof и strtod делают то, что вы хотите, но очень прощаете. Если вы не хотите принимать строки, такие как "32asd" как действительные, вам нужно обернуть strtod в такую функцию, как:
#include <stdlib.h>
double strict_str2double(char* str)
{
char* endptr;
double value = strtod(str, &endptr);
if (*endptr) return 0;
return value;
}
Ответ 4
Если это c-строка (массив с нулевым символом типа char), вы можете сделать что-то вроде:
#include <stdlib.h>
char str[] = "3.14159";
double num = atof(str);
Если это строка С++, просто используйте метод c_str():
double num = atof( cppstr.c_str() );
atof() преобразует строку в double, возвращая 0 при ошибке. Функция зарегистрирована здесь: http://www.cplusplus.com/reference/clibrary/cstdlib/atof.html
Ответ 5
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << stod(" 99.999 ") << endl;
}
Вывод: 99.999
(который двойной, пробел был автоматически лишен)
Так как С++ 11 преобразование строки в значения с плавающей запятой (например, double) доступно с функциями:
stof - преобразовать str в float
stod - преобразовать str в double
stold - преобразовать str в длинный двойной
Мне нужна функция, которая возвращает 0, когда строка не является числовой.
Вы можете добавить оператор try catch, когда stod
выдает исключение.
Ответ 6
Должен сказать, что я согласен с тем, что самым изящным решением для этого является использование boost:: lexical_cast. Затем вы можете поймать bad_lexical_cast, который может произойти, и сделать что-то, когда он терпит неудачу, вместо получения 0.0, который atof дает.
#include <boost/lexical_cast.hpp>
#include <string>
int main()
{
std::string str = "3.14";
double strVal;
try {
strVal = boost::lexical_cast<double>(str);
} catch(bad_lexical_cast&) {
//Do your errormagic
}
return 0;
}
Ответ 7
Одним из самых элегантных решений этой проблемы является использование boost:: lexical_cast, о чем упоминал @Evgeny Lazin.
Ответ 8
Я думаю, atof - именно то, что вы хотите. Эта функция анализирует строку и преобразует ее в двойную. Если строка не начинается с числа (не числового), возвращается 0.0.
Однако он пытается проанализировать как можно большую часть строки. Другими словами, строка "3abc" будет интерпретирована как 3.0. Если вам нужна функция, которая вернет 0.0 в этих случаях, вам нужно будет написать небольшую обертку самостоятельно.
Кроме того, эта функция работает со строкой C-стиля с нулевым завершаемым массивом символов. Если вы используете строковый объект, перед использованием этой функции его нужно будет преобразовать в char *.
Ответ 9
Существует не одна функция, которая будет делать это, потому что 0 является допустимым числом, и вам нужно уловить, когда строка не является допустимым числом.
Вам нужно будет сначала проверить строку (возможно, с помощью регулярного выражения), чтобы увидеть, содержит ли она только числа и числовую пунктуацию. Затем вы можете принять решение о возврате 0, если это то, что требуется вашему приложению, или преобразовать его в двойное.
После поиска atof() и strtod(), я должен перефразировать мое выражение на "не должно быть", а не "нет"... хехе