Comment déterminer si une chaîne de caractères est un nombre en C++

Jinku Hu 12 octobre 2023
  1. Utilisez la méthode std::isdigit pour déterminer si une chaîne est un nombre
  2. Utilisez std::isdigit avec std::ranges::all_of pour déterminer si une chaîne est un nombre
  3. Utilisez la méthode find_first_not_of pour déterminer si une chaîne est un nombre
Comment déterminer si une chaîne de caractères est un nombre en C++

Cet article explique comment savoir si une chaîne C++ donnée est un nombre. Avant de nous lancer, il convient de noter que les méthodes suivantes ne sont compatibles qu’avec les chaînes de caractères à un octet et les nombres décimaux intégraux.

Utilisez la méthode std::isdigit pour déterminer si une chaîne est un nombre

La première version est probablement la façon la plus évidente de mettre en œuvre la solution. Il s’agit de passer une chaîne de caractères en paramètre à une fonction isNumber, qui itére sur chaque carreau de la chaîne et vérifie avec la méthode isdigit. Lorsqu’elle trouve le premier non-numéro, la fonction retourne faux, si aucun n’est trouvé, elle retourne vrai.

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

Production:

Not number Number Not number

Remarquez que nous produisons un verdict sur chaque chaîne via un opérateur conditionnel ternaire, qui est une variante concise de if-else.

Utilisez std::isdigit avec std::ranges::all_of pour déterminer si une chaîne est un nombre

La méthode précédente était assez basique pour le puissant C++, alors implémentons une solution plus éloquente en utilisant la méthode C++20 std::ranges::all_of et quelques expressions lambda. Dans notre cas, ranges::all_of vérifie si le lambda spécifié retourne vrai pour chaque élément de la plage donnée s.begin(), s.end() et retourne vrai si la condition est remplie.

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

Utilisez la méthode find_first_not_of pour déterminer si une chaîne est un nombre

Cette version utilise un algorithme de recherche par chaîne intégré. L’algorithme recherche le premier caractère égal à aucun des caractères de la chaîne passés en argument (dans notre cas - "0123456789"). Si le caractère n’est pas trouvé, string::npos est renvoyé, nous renvoyons donc le résultat de la comparaison 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;
}
Auteur: 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

Article connexe - C++ String