float - convert string to int c++
Cómo comprobar std:: string si se trata de un número entero? (3)
El siguiente código convierte un std::string
en int
y el problema radica en el hecho de que no puede discernir entre un entero verdadero o simplemente una cadena aleatoria. ¿Hay un método sistemático para tratar ese problema?
#include <cstring>
#include <iostream>
#include <sstream>
int main()
{
std::string str = "H";
int int_value;
std::istringstream ss(str);
ss >> int_value;
std::cout<<int_value<<std::endl;
return 0;
}
EDIT : esta es la solución que me gusta porque es muy minimalista y elegante. No funciona para números negativos, pero de todos modos solo necesitaba positivos.
#include <cstring>
#include <iostream>
#include <sstream>
int main()
{
std::string str = "2147483647";
int int_value;
std::istringstream ss(str);
if (ss >> int_value)
std::cout << "Hooray!" << std::endl;
std::cout<<int_value<<std::endl;
str = "-2147483648";
std::istringstream negative_ss(str);
if (ss >> int_value)
std::cout << "Hooray!" << std::endl;
std::cout<<int_value<<std::endl;
return 0;
}
Puede intentar usar Boost lexical_cast
, emitirá una excepción si el lanzamiento falla.
int number;
try
{
number = boost::lexical_cast<int>(str);
}
catch(boost::bad_lexical_cast& e)
{
std::cout << str << "isn''t an integer number" << std::endl;
}
EDIT Accorinding a @chris, también puede intentar usar std::stoi
desde C ++ 11. std::invalid_argument
excepción std::invalid_argument
si no se puede realizar ninguna conversión. Puede encontrar más información aquí: std :: stoi
El enfoque de WhozCraig es mucho más agradable y quería ampliarlo utilizando el enfoque que utilizan las preguntas frecuentes de C ++, que es el siguiente:
#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>
class BadConversion : public std::runtime_error {
public:
BadConversion(std::string const& s)
: std::runtime_error(s)
{ }
};
inline int convertToInt(std::string const& s,
bool failIfLeftoverChars = true)
{
std::istringstream i(s);
int x;
char c;
if (!(i >> x) || (failIfLeftoverChars && i.get(c)))
throw BadConversion("convertToInt(/"" + s + "/")");
return x;
}
int main()
{
std::cout << convertToInt( "100" ) << std::endl ;
std::cout << convertToInt( "-100" ) << std::endl ;
std::cout << convertToInt( " -100" ) << std::endl ;
std::cout << convertToInt( " -100 ", false ) << std::endl ;
// The next two will fail
std::cout << convertToInt( " -100 ", true ) << std::endl ;
std::cout << convertToInt( "H" ) << std::endl ;
}
Esto es sólido y sabrá si la conversión falla, también puede optar por fallar en los caracteres restantes.
/* isdigit example */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main ()
{
char str[]="1776ad";
int year;
if (isdigit(str[0]))
{
year = atoi (str);
printf ("The year that followed %d was %d./n",year,year+1);
}
return 0;
}