Чтобы решить эту проблему, вы можете использовать /^[0-1][0-9]$/;
. Если вы хотите, чтобы 01
был 12
, вам нужно проверить два условия:
Используется ли значение 00
с помощью if
оператор:
if(thevale=="00")
{
// message to user...not allowed
}
и:
if(thevalue >=13)
{
// message to user...not allowed
}
Пример кода в Javascript:
function CheckMonth(txtBox) {
var ex = /^[0-1][0-9]$/;
if (txtBox.value.trim() != "") {
if (txtBox.value.trim() == "00") {
alert('Please enter valid numbers.');
txtBox.value = "";
txtBox.focus();
}
else if (ex.test(txtBox.value.trim()) == false) {
alert('Please enter valid numbers.');
txtBox.value = "";
txtBox.focus();
}
else if (parseInt(txtBox.value.trim()) >= 13) {
alert('Please enter valid numbers.');
txtBox.value = "";
txtBox.focus();
}
}
}
для проверки ввода является числовым (с плавающей точкой)
blockquote>1) Принять ввод в виде строки
char buf[Big_Enough]
. Я ожидаю, что 160 цифр будут обрабатывать все, кроме самых загадочных «плавающих» строк 1 sup>.#define N 160 char buf[N]; if (fgets, buf, sizeof buf, stdin) {
2) Применить
float strtof()
дляfloat
, (strtod()
дляdouble
,strtold()
дляlong double
).char *endptr; errno = 0; float d = strtof(buf, &endptr); // endptr now points to the end of the conversion, if any.
3) Проверить результаты.
if (buf == endptr) return "No_Conversion"; // Recommend to tolerate trailing white-space. // as leading white-spaces are already allowed by `strtof()` while (isspace((unsigned char)*endptr) { endptr++; } if (*endptr) return "TrailingJunkFound"; return "Success";
4) Испытания на крайности, если необходимо.
В этот момент ввод является числовым. Остается вопрос, хорошо ли «конечная строка» может быть представлена конечной
float
: если a the | result | находится в диапазоне0
или[FLT_TRUE_MIN...FLT_MAX]
.Это включает в себя рассмотрение
errno
.Преобразование «успешно», но конечные строковые значения вне диапазона
float
становятсяHUGE_VALF
, которые могут быть бесконечностью илиFLT_MAX
.Wee | значения | близко к 0.0, но не 0.0 становится чем-то в диапазоне
[0.0 ... INT_MIN]
.Так как цель состоит в том, чтобы определить, успешно ли выполнено преобразование (оно имело место), я оставлю эти подробности для вопроса, который хочет узнать о том, какое значение .
Альтернативой является использование
fscanf()
для непосредственного чтения и преобразования, однако обработка ошибок там тоже имеет свои проблемы, которые трудно контролировать.
1 sup> Типичный диапазон
float
составляет +/- 10 38 sup>. Таким образом, учет 40 или более символов имеет смысл. Точный точный отпечатокFLT_TRUE_MIN
может содержать ~ 150 символов. Чтобы отличить произвольно строку «float» отFLT_TRUE_MIN
от следующей, более крупной, нужно примерно столько цифр.Если «плавающие» строки не являются произвольными, а поступают только с выходных данных напечатанного
float
, тогда требуется намного меньше цифр - около 40.Конечно, разумно предусмотреть дополнительные начальные / конечные пробелы и нули.
Вам необходимо принять входные данные как строку , а затем использовать strtod()
для анализа входных данных.
Относительно возвращаемых значений, из справочной страницы :
double strtod(const char *nptr, char **endptr);
Эти функции возвращают преобразованное значение, если оно есть.
Если
endptr
не равно NULL, указатель на символ после последнего символа, использованного в преобразовании, сохраняется в местоположении, указанном вendptr
.Если преобразование не выполняется, возвращается ноль, и значение
blockquote>nptr
сохраняется в местоположении, указанном вendptr
.Приступая к точке обнаружения ошибок, пара моментов:
- Убедитесь, что
errno
установлено на0
до вызова, и оно все еще равно0
. после звонка.- Возвращаемое значение не
HUGE_VAL
.- Содержимое, на которое указывает
*endptr
, не является нулевым и не равноnptr
(т.е. разговор не был предварительно сформирован).Вышеупомянутые проверки, объединенные вместе, обеспечат успешное преобразование.
В вашем случае, последняя точка важна, так как если на входе присутствует недопустимый символ,
*endptr
не будет указывать на ноль, вместо этого он будет содержать адрес этого (первый ) недопустимый символ на входе.
Вот непроверенный код для проверки соответствия строки запрошенной спецификации.
#include <ctype.h>
/* IsFloatNumeral returns true (1) if the string pointed to by p contains a
valid numeral and false (0) otherwise. A valid numeral:
Starts with optional white space.
Has an optional hyphen as a minus sign.
Contains either digits, a period followed by digits, or both.
Ends with optional white space.
Notes:
It is unusual not to accept "3." for a float literal, but this was
specified in a comment, so the code here is written for that.
The question does not state that leading or trailing white space
should be accepted (and ignored), but that is included here. To
exclude such white space, simply delete the relevant lines.
*/
_Bool IsFloatNumeral(const char *p)
{
_Bool ThereAreInitialDigits = 0;
_Bool ThereIsAPeriod = 0;
// Skip initial spaces. (Not specified in question; removed if undesired.)
while (isspace(*p))
++p;
// Allow an initial hyphen as a minus sign.
if (*p == '-')
++p;
// Allow initial digits.
if (isdigit(*p))
{
ThereAreInitialDigits = 1;
do
++p;
while (isdigit(*p));
}
// Allow a period followed by digits. Require at least one digit to follow the period.
if (*p == '.')
{
++p;
if (!isdigit(*p))
return 0;
ThereIsAPeriod = 1;
do
++p;
while (isdigit(*p));
}
/* If we did not see either digits or a period followed by digits,
reject the string (return 0).
*/
if (!ThereAreInitialDigits && !ThereIsAPeriod)
return 0;
// Skip trailing spaces. (Not specified in question; removed if undesired.)
while (isspace(*p))
++p;
/* If we are now at the end of the string (the null terminating
character), accept the string (return 1). Otherwise, reject it (return
0).
*/
return *p == 0;
}