Utilisez la famille de fonctions std::stod en C++
Cet article explique et montre plusieurs méthodes d’utilisation de la famille de fonctions std::stod
en C++.
Utilisez std::stod
pour convertir une string
en valeur à virgule flottante en C++
La fonction std::stod
avec std::stof
et std::stold
est fournie par STL pour effectuer une conversion de string
en virgule flottante. Notez que nous disons conversion, mais cela ressemble plus à une interprétation du contenu de la chaîne en tant que valeur à virgule flottante. À savoir, ces fonctions analysent les arguments string
donnés avec des règles d’analyse prédéfinies pour identifier les nombres à virgule flottante valides et les stocker dans l’objet de type correspondant.
Les fonctions sont différenciées par le suffixe, qui indique le type qu’elles renvoient. L’objet std::stod
renvoie la valeur double
, std::stof
renvoie un flottant et std::stold
renvoie long double
. Ces fonctions font partie de STL depuis C++11 et sont incluses dans le fichier d’en-tête <string>
.
Dans les extraits de code ci-dessous, nous allons explorer différents scénarios de conversion et approfondir les règles d’analyse de ces fonctions. Le premier exemple est le cas le plus simple où l’objet string
ne comprend que des chiffres et un délimiteur décimal(.
). La fonction std::stod
interprète les séquences de caractères données comme des nombres valides à virgule flottante et les stocke dans un type double
. Notez que le délimiteur décimal ne peut pas être la virgule (.
) car il ne sera pas considéré comme faisant partie du nombre.
#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;
}
Production:
std::stod("123.0") is 123 std::stod("0.123") is 0.123
Alternativement, si nous avons des objets string
où des chiffres sont mélangés avec d’autres caractères, deux cas courants peuvent être distingués. Le premier scénario : l’objet string
commence par des chiffres suivis des autres caractères ; la fonction std::stod
extrait les chiffres de départ avant que le premier caractère non numérique (à l’exclusion du délimiteur décimal) ne soit rencontré.
Deuxième scénario : l’argument string
commence par des caractères non numériques, auquel cas la fonction lève l’exception std::invalid_argument
et n’est pas en mesure d’effectuer la conversion.
#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;
}
Production:
std::stod("123.0") is 123 std::stod("0.123") is 0.123
Généralement, std::stod
et sa famille de fonctions suppriment les caractères d’espacement de départ. Ainsi, si nous passons une chaîne avec plusieurs caractères d’espacement suivis des chiffres, la conversion sera effectuée avec succès, comme le montre l’exemple suivant.
De plus, ces fonctions peuvent prendre un argument optionnel du type size_t*
, qui stockera le nombre de caractères traités si l’appel est réussi. Notez que les premiers caractères blancs comptent également si la chaîne est convertie en nombre à virgule flottante valide.
#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;
}
Production:
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