Use a família de funções std::stod em C++

Jinku Hu 12 outubro 2023
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
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

Artigo relacionado - C++ Function