Kiểm tra xem một chuỗi (std::string) có chỉ chứa các chữ số 0-9 hay không. Cách đơn giản là duyệt từng ký tự và dùng std::isdigit().
Hàm kiểm tra cơ bản
#include <iostream>
#include <string>
#include <cctype> // cho isdigit()
using namespace std;
bool isNumeric(const string& str) {
if (str.empty()) return false;
for (char c : str) {
if (!isdigit(static_cast<unsigned char>(c))) {
return false;
}
}
return true;
}
int main() {
string input;
cout << "Nhap chuoi: ";
cin >> input;
if (isNumeric(input)) {
cout << "Day la so nguyen" << endl;
} else {
cout << "Day KHONG phai so" << endl;
}
}
Kết quả
Nhap chuoi: 5687
Day la so nguyen
Nhap chuoi: 584asS
Day KHONG phai so
Các trường hợp cần lưu ý
| Input | isNumeric() | Ghi chú |
"123" | true | |
"-123" | false | Dấu '-' không phải digit |
"+123" | false | Dấu '+' không phải digit |
"12.34" | false | Dấu '.' không phải digit |
" 123 " | false | Khoảng trắng không phải digit |
"" | false | Chuỗi rỗng |
"0" | true | |
Mở rộng: Hỗ trợ số âm, số thực
bool isInteger(const string& s) {
if (s.empty()) return false;
size_t start = (s[0] == '-' || s[0] == '+') ? 1 : 0;
if (start == s.size()) return false; // Chỉ có dấu
for (size_t i = start; i < s.size(); ++i) {
if (!isdigit(static_cast<unsigned char>(s[i]))) return false;
}
return true;
}
bool isFloat(const string& s) {
// Phức tạp hơn - có thể dùng stringstream hoặc regex
// Xem phương pháp dưới
}
Phương pháp thay thế: stringstream
#include <sstream>
bool isNumber(const string& s) {
stringstream ss(s);
double d;
char c;
return (ss >> d) && !(ss >> c); // Đọc được số và không còn ký tự thừa
}
Phương pháp C++17: std::from_chars (Hiệu năng cao nhất)
#include <charconv>
bool isIntegerFast(const string& s) {
int value;
auto result = std::from_chars(s.data(), s.data() + s.size(), value);
return result.ec == std::errc{} && result.ptr == s.data() + s.size();
}
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
| Duyệt + isdigit | Đơn giản, không phụ thuộc locale | Chỉ số nguyên dương |
| stringstream | Hỗ trợ float, dấu, khoa học | Chậm, phụ thuộc locale |
| std::from_chars (C++17) | Nhanh nhất, không locale, không exception | Chỉ số nguyên/float cơ bản |
| Regex | Linh hoạt pattern | Rất chậm |
Khuyến nghị
- Chỉ kiểm tra chữ số 0-9: Duyệt +
isdigit
- Parse số thực tế:
std::from_chars (C++17) hoặc strtod
- Input người dùng phức tạp:
stringstream hoặc regex