Cómo determinar si una cadena es un número en C++

Jinku Hu 12 octubre 2023
  1. Utilice el método std::isdigit para determinar si una cadena es un número
  2. Usa std::isdigit con std::ranges::all_of para determinar si una cadena es un número
  3. Utiliza el método find_first_not_of para determinar si una cadena es un número
Cómo determinar si una cadena es un número en C++

Este artículo explica cómo averiguar si una cadena de C++ dada es un número. Antes de entrar en materia, hay que tener en cuenta que los siguientes métodos sólo son compatibles con cadenas de caracteres de un solo byte y números integrales decimales.

Utilice el método std::isdigit para determinar si una cadena es un número

La primera versión es probablemente la forma más obvia de implementar la solución. Es decir, pasar una cadena como parámetro a una función isNumber, que itera sobre cada uno de los char de la string y comprueba con el método isdigit. Cuando encuentra el primer no-número la función devuelve false, si no se encuentra ninguno devuelve true.

#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& str) {
  for (char const& c : str) {
    if (std::isdigit(c) == 0) return false;
  }
  return true;
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}

Resultado:

Not number Number Not number

Fíjese que emitimos el veredicto sobre cada string mediante el operador condicional ternario ? :, que es una variante concisa de if-else.

Usa std::isdigit con std::ranges::all_of para determinar si una cadena es un número

El método anterior era bastante básico para el poderoso C++, así que implementemos una solución más elocuente usando el método de C++20 std::ranges::all_of y algunas expresiones lambda. En nuestro caso range::all_of comprueba si la lambda especificada devuelve true para cada elemento del rango dado s.begin(), s.end() y devuelve true si se cumple la condición.

#include <algorithm>
#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& s) {
  return std::ranges::all_of(s.begin(), s.end(),
                             [](char c) { return isdigit(c) != 0; });
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}

Utiliza el método find_first_not_of para determinar si una cadena es un número

Esta versión utiliza un algoritmo de búsqueda incorporado de string. El algoritmo busca el primer carácter igual a ninguno de los caracteres de string pasados como argumento (en nuestro caso - "0123456789"). Si el carácter no se encuentra cadena::npos se devuelve, por lo que devolvemos el resultado de la comparación de isNumber.

#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& str) {
  return str.find_first_not_of("0123456789") == string::npos;
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}
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++ String