Come posso convertire una stringa in doppia in C ++?

Come posso convertire una stringa in doppia in C ++? Voglio una funzione che restituisce 0 quando la stringa non è numerica.

Vedi Domande frequenti su C ++ Lite Come posso convertire una stringa: std :: ::

Vedi Super-FAQ C ++ Come posso convertire una stringa: std :: ::

Si noti che con le proprie esigenze non è ansible distinguere tutte le rappresentazioni di stringa consentite di zero dalle stringhe non numeriche.

// the requested function #include  double string_to_double( const std::string& s ) { std::istringstream i(s); double x; if (!(i >> x)) return 0; return x; } // some tests #include  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; } 

Il modo più semplice è usare boost :: lexical_cast :

 double value; try { value = boost::lexical_cast(my_string); } catch (boost::bad_lexical_cast const&) { value = 0; } 

atof e strtod fanno quello che vuoi ma perdonano molto. Se non si desidera accettare stringhe come “32asd” come valide è necessario avvolgere strtod in una funzione come questa:

 #include  double strict_str2double(char* str) { char* endptr; double value = strtod(str, &endptr); if (*endptr) return 0; return value; } 

Se è una c-string (array con terminazione null di tipo char), puoi fare qualcosa come:

 #include  char str[] = "3.14159"; double num = atof(str); 

Se è una stringa C ++, usa semplicemente il metodo c_str ():

 double num = atof( cppstr.c_str() ); 

atof () convertirà la stringa in doppia, restituendo 0 in caso di errore. La funzione è documentata qui: http://www.cplusplus.com/reference/clibrary/cstdlib/atof.html

 #include  #include  using namespace std; int main() { cout << stod(" 99.999 ") << endl; } 

Uscita: 99.999 (che è doppio, lo spazio bianco è stato automaticamente rimosso)

Poiché C ++ 11 la conversione della stringa in valori a virgola mobile (come il doppio) è disponibile con le funzioni:
stof - converte str in float
stod : converti str a doppio
stold - converte str in long long

Voglio una funzione che restituisce 0 quando la stringa non è numerica.

È ansible aggiungere la dichiarazione try catch quando stod genera un'eccezione.

Devo dire che sono d’accordo che la soluzione più elegante per questo è usare boost :: lexical_cast. È quindi ansible prendere il bad_lexical_cast che potrebbe occorrere, e fare qualcosa quando fallisce, invece di ottenere 0.0 che atof dà.

 #include  #include  int main() { std::string str = "3.14"; double strVal; try { strVal = boost::lexical_cast(str); } catch(bad_lexical_cast&) { //Do your errormagic } return 0; } 

Una delle soluzioni più eleganti a questo problema è usare boost :: lexical_cast come @Evgeny Lazin menzionato.

Penso che sia esattamente quello che vuoi. Questa funzione analizza una stringa e la converte in una doppia. Se la stringa non inizia con un numero (non numerico) viene restituito uno 0,0.

Tuttavia, cerca di analizzare il più ansible la stringa. In altre parole, la stringa “3abc” sarebbe interpretata come 3.0. Se si desidera una funzione che restituirà 0.0 in questi casi, sarà necessario scrivere un piccolo wrapper autonomamente.

Inoltre, questa funzione funziona con la stringa in stile C di una matrice di caratteri terminata da null. Se stai usando un object stringa, sarà necessario convertirlo in un char * prima di usare questa funzione.

Non c’è una singola funzione che lo farà, perché 0 è un numero valido e devi essere in grado di catturare quando la stringa non è un numero valido.

Dovrai prima controllare la stringa (probabilmente con un’espressione regolare) per vedere se contiene solo numeri e punteggiatura numerica. Puoi quindi decidere di restituire 0 se è ciò di cui l’applicazione ha bisogno o convertirlo in doppio.

Dopo aver guardato atof () e strtod () dovrei riformulare la mia affermazione in “non dovrebbe esserci” invece di “non c’è” … hehe