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
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