Utilisez la famille de fonctions std::stod en C++

Jinku Hu 12 octobre 2023
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
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ Function