Determina se una stringa è un numero in C++

Jinku Hu 12 ottobre 2023
  1. Usa il metodo std::isdigit per determinare se una stringa è un numero
  2. Usa std::isdigit con std::range::all_of per determinare se una stringa è un numero
  3. Usa il metodo find_first_not_of per determinare se una stringa è un numero
Determina se una stringa è un numero in C++

Questo articolo spiega come scoprire se una determinata stringa C++ è un numero. Prima di approfondire, è opportuno notare che i seguenti metodi sono compatibili solo con stringhe di caratteri a byte singolo e numeri interi decimali.

Usa il metodo std::isdigit per determinare se una stringa è un numero

La prima versione è probabilmente il modo più ovvio per implementare la soluzione. Vale a dire, passare una stringa come parametro a una funzione isNumber, che itera su ogni singolo char nella stringa e controlla con il metodo isdigit. Quando trova il primo non numero la funzione restituisce falso, se non ne trova nessuno restituisce vero.

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

Produzione:

Not number
Number
Not number

Si noti che emettiamo il verdetto su ogni stringa tramite ? :Operatore condizionale ternario, che è una variante concisa di if-else.

Usa std::isdigit con std::range::all_of per determinare se una stringa è un numero

Il metodo precedente era abbastanza semplice per il potente C++, quindi implementiamo una soluzione più eloquente usando il metodo C++ 20 std::range::all_of e alcune espressioni lambda. Nel nostro caso range::all_of controlla se il lambda specificato restituisce true per ogni elemento dell’intervallo dato s.begin(), s.end() e restituisce true se la condizione è soddisfatta.

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

Usa il metodo find_first_not_of per determinare se una stringa è un numero

Questa versione utilizza un algoritmo di ricerca stringa integrato. L’algoritmo cerca il primo carattere uguale a nessuno dei caratteri in stringa passati come argomento (nel nostro caso - "0123456789"). Se il carattere non viene trovato, viene restituita string::npos, quindi restituiamo il risultato del confronto da 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;
}
Autore: 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

Articolo correlato - C++ String