Determina se una stringa è un numero in C++
-
Usa il metodo
std::isdigit
per determinare se una stringa è un numero -
Usa
std::isdigit
constd::range::all_of
per determinare se una stringa è un numero -
Usa il metodo
find_first_not_of
per determinare se una stringa è un numero
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;
}
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