Usa la famiglia di funzioni std::stod in C++
Questo articolo spiega e dimostra diversi metodi su come utilizzare la famiglia di funzioni std::stod
in C++.
Usa std::stod
per convertire una string
in un valore in virgola mobile in C++
La funzione std::stod
insieme a std::stof
e std::stold
sono fornite da STL per eseguire una conversione da stringa
a virgola mobile. Nota che diciamo conversione, ma è più simile a un’interpretazione del contenuto della stringa come un valore a virgola mobile. Vale a dire, queste funzioni scansionano gli argomenti stringa
dati con regole di analisi predefinite per identificare i numeri a virgola mobile validi e memorizzarli nell’oggetto di tipo corrispondente.
Le funzioni sono differenziate dal suffisso, che indica il tipo da esse restituito. L’oggetto std::stod
restituisce il valore double
, std::stof
restituisce un float e std::stold
restituisce long double
. Queste funzioni fanno parte di STL dal C++ 11 e sono incluse nel file di intestazione <string>
.
Nei seguenti frammenti di codice di seguito, esploreremo diversi scenari di conversione e approfondiremo le regole di analisi di queste funzioni. Il primo esempio è il caso più semplice in cui l’oggetto stringa
include solo cifre e delimitatore decimale (.
). La funzione std::stod
interpreta le sequenze di caratteri date come numeri a virgola mobile validi e le memorizza in un tipo double
. Si noti che il delimitatore decimale non può essere il carattere virgola (,
) poiché non verrà considerato come parte del numero.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "123.0";
string str2 = "0.123";
auto m1 = std::stod(str1);
auto m2 = std::stod(str2);
cout << "std::stod(\"" << str1 << "\") is " << m1 << endl;
cout << "std::stod(\"" << str2 << "\") is " << m2 << endl;
return EXIT_SUCCESS;
}
Produzione:
std::stod("123.0") is 123 std::stod("0.123") is 0.123
In alternativa, se abbiamo oggetti stringa
in cui le cifre sono mescolate con altri caratteri, si possono individuare due casi comuni. Il primo scenario: l’oggetto stringa
inizia con cifre seguite dagli altri caratteri; la funzione std::stod
estrae le cifre iniziali prima che venga incontrato il primo carattere non numerico (escluso il delimitatore decimale).
Il secondo scenario: l’argomento stringa
inizia con caratteri non numerici, nel qual caso la funzione genera l’eccezione std::invalid_argument
e non è in grado di condurre la conversione.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
string str3 = "123.4 with chars";
string str4 = "chars 1.2";
auto m3 = std::stod(str3);
// auto m4 = std::stod(str4);
cout << "std::stod(\"" << str3 << "\") is " << m3 << endl;
return EXIT_SUCCESS;
}
Produzione:
std::stod("123.0") is 123 std::stod("0.123") is 0.123
In genere, std::stod
e la sua famiglia di funzioni scartano i caratteri di spaziatura iniziali. Quindi, se passiamo una stringa con più spazi iniziali seguiti dalle cifre, la conversione verrà eseguita correttamente, come dimostrato nell’esempio seguente.
Inoltre, queste funzioni possono prendere un argomento opzionale del tipo size_t*
, che memorizzerà il numero di caratteri elaborati se la chiamata ha esito positivo. Si noti che i caratteri di spaziatura iniziali contano anche se la stringa viene convertita nel numero a virgola mobile valido.
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
string str3 = "123.4 with chars";
string str5 = " 123.4";
size_t ptr1 = -1;
size_t ptr2 = -1;
auto m4 = std::stod(str3, &ptr1);
auto m5 = std::stod(str5, &ptr2);
cout << m4 << " - characters processed: " << ptr1 << endl;
cout << "std::stod(\"" << str5 << "\") is " << m5 << " - " << ptr2
<< " characters processed" << endl;
cout << "length: " << str5.size() << endl;
return EXIT_SUCCESS;
}
Produzione:
123.4 - characters processed : 5 std::stod(" 123.4") is 123.4 -
16 characters processed length : 16
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook