Utilice la familia de funciones std::stod en C++

Jinku Hu 12 octubre 2023
Utilice la familia de funciones std::stod en C++

Este artículo explica y demuestra varios métodos de cómo utilizar la familia de funciones std::stod en C++.

Utilice std::stod para convertir una string en un valor de coma flotante en C++

La función std::stod junto con std::stof y std::stold son proporcionadas por STL para realizar una conversión de string a punto flotante. Tenga en cuenta que decimos conversión, pero es más como una interpretación del contenido de la cadena como un valor de punto flotante. Es decir, estas funciones escanean los argumentos de string dados con reglas de análisis predefinidas para identificar los números de punto flotante válidos y almacenarlos en el objeto de tipo correspondiente.

Las funciones se diferencian por el sufijo, que indica el tipo que devuelven. El objeto std::stod devuelve un valor double, std::stof devuelve un flotante y std::stold devuelve long double. Estas funciones han sido parte de STL desde C++ 11 y están incluidas en el archivo de encabezado <string>.

En los siguientes fragmentos de código, exploraremos diferentes escenarios de conversión y profundizaremos en las reglas de análisis de estas funciones. El primer ejemplo es el caso más simple cuando el objeto string solo incluye dígitos y delimitador decimal (.). La función std::stod interpreta las secuencias de caracteres dadas como números de punto flotante válidos y las almacena en un tipo double. Tenga en cuenta que el delimitador decimal no puede ser el carácter de coma (,) ya que no se considerará como parte del número.

#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;
}

Producción :

std::stod("123.0") is 123
std::stod("0.123") is 0.123

Alternativamente, si tenemos objetos de string donde los dígitos se mezclan con otros caracteres, se pueden distinguir dos casos comunes. El primer escenario: el objeto string comienza con dígitos seguidos de los otros caracteres; la función std::stod extrae los dígitos iniciales antes de que se encuentre el primer carácter que no es un dígito (excluyendo el delimitador decimal).

El segundo escenario: el argumento string comienza con caracteres que no son dígitos, en cuyo caso la función lanza la excepción std::invalid_argument y no puede realizar la conversión.

#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;
}

Producción :

std::stod("123.0") is 123
std::stod("0.123") is 0.123

Generalmente, std::stod y su familia de funciones descartan los espacios en blanco iniciales. Por lo tanto, si pasamos una cadena con varios espacios en blanco iniciales seguidos de los dígitos, la conversión se realizará correctamente, como se muestra en el siguiente ejemplo.

Además, estas funciones pueden tomar un argumento opcional del tipo size_t*, que almacenará el número de caracteres procesados ​​si la llamada es exitosa. Tenga en cuenta que los espacios en blanco iniciales también cuentan si la cadena se convierte al número de punto flotante válido.

#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;
}

Producción :

123.4 - characters processed: 5
std::stod("           123.4") is 123.4 - 16 characters processed
length: 16
Autor: 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

Artículo relacionado - C++ Function