Khái niệm
Xác thực xem một chuỗi cho trước có phải đại diện cho một số hợp lệ hay không.
Ví dụ: "12.5" → true; "def" → false; "2e5" → true; "10e4.4" → false.
Các quy tắc xử lý
- Bỏ qua khoảng trắng đầu và cuối.
- Cho phép ký tự '+', '-', '.' ở đầu.
- Chỉ chấp nhận ký tự trong tập {+, -, ., e, 0-9}.
- Không cho phép '.' sau 'e'.
- Sau '.' phải có chữ số.
- Sau 'e' phải theo '+', '-' hoặc chữ số.
Ví dụ (C++)
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int valid_number1(string str1){
int i = 0, j = str1.length() - 1;
while (i < str1.length() && str1[i] == ' ') i++;
while (j >= 0 && str1[j] == ' ') j--;
if (i > j) return 0;
if (i == j && !(str1[i] >= '0' && str1[i] <= '9')) return 0;
if (str1[i] != '.' && str1[i] != '+' && str1[i] != '-' && !(str1[i] >= '0' && str1[i] <= '9')) return 0;
bool flagDotOrE = false;
for (; i <= j; i++) {
if (str1[i] != 'e' && str1[i] != '.' && str1[i] != '+' && str1[i] != '-' && !(str1[i] >= '0' && str1[i] <= '9')) return 0;
if (str1[i] == '.') {
if (flagDotOrE) return 0;
if (i + 1 > str1.length()) return 0;
if (!(str1[i+1] >= '0' && str1[i+1] <= '9')) return 0;
}
else if (str1[i] == 'e') {
flagDotOrE = true;
if (!(str1[i-1] >= '0' && str1[i-1] <= '9')) return 0;
if (i + 1 > str1.length()) return 0;
if (str1[i+1] != '+' && str1[i+1] != '-' && !(str1[i+1] >= '0' && str1[i+1] <= '9')) return 0;
}
}
return 1;
}
int main(){
char str1[] = "0.1e10";
if (valid_number1(str1)) cout << "true";
else cout << "false";
return 0;
}
Đầu ra
true