Use a família de funções std::stod em C++
Este artigo explica e demonstra vários métodos de como usar a família de funções std::stod
em C++.
Use std::stod
para converter uma string
em um valor de ponto flutuante em C++
A função std::stod
junto com std::stof
e std::stold
são fornecidos pelo STL para conduzir uma string
para conversão de ponto flutuante. Observe que dizemos conversão, mas é mais como uma interpretação do conteúdo da string como um valor de ponto flutuante. A saber, essas funções examinam os argumentos de string
fornecidos com regras de análise predefinidas para identificar os números de ponto flutuante válidos e armazená-los no objeto de tipo correspondente.
As funções são diferenciadas pelo sufixo, que indica o tipo retornado por elas. O objeto std::stod
retorna o valor double
, std::stof
retorna um float e std::stold
retorna long double
. Essas funções fazem parte do STL desde C++ 11 e estão incluídas no arquivo de cabeçalho <string>
.
Nos trechos de código a seguir, vamos explorar diferentes cenários de conversão e nos aprofundar nas regras de análise dessas funções. O primeiro exemplo é o caso mais simples quando o objeto string
inclui apenas dígitos e delimitador decimal (.
). A função std::stod
interpreta as sequências de caracteres fornecidas como os números de ponto flutuante válidos e os armazena em um tipo double
. Observe que o delimitador decimal não pode ser o caractere de vírgula (,
), pois não será considerado parte do 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;
}
Resultado:
std::stod("123.0") is 123 std::stod("0.123") is 0.123
Alternativamente, se temos objetos string
onde os dígitos são misturados com outros caracteres, dois casos comuns podem ser destacados. O primeiro cenário: o objeto string
começa com dígitos seguidos pelos outros caracteres; a função std::stod
extrai os dígitos iniciais antes que o primeiro caractere diferente de dígito (excluindo o delimitador decimal) seja encontrado.
O segundo cenário: o argumento string
começa com caracteres não-dígitos, caso em que a função lança a exceção std::invalid_argument
e não é capaz de conduzir a conversão.
#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;
}
Resultado:
std::stod("123.0") is 123 std::stod("0.123") is 0.123
Geralmente, std::stod
e sua família de funções descartam os caracteres de espaço em branco iniciais. Portanto, se passarmos uma string com vários caracteres de espaço em branco seguidos de dígitos, a conversão será realizada com sucesso, conforme demonstrado no exemplo a seguir.
Além disso, essas funções podem receber um argumento opcional do tipo size_t*
, que armazenará o número de caracteres processados se a chamada for bem-sucedida. Observe que os caracteres de espaço em branco iniciais também contam se a string for convertida para o número de ponto flutuante 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;
}
Resultado:
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