Как проверить, является ли ввод числовым (с плавающей точкой) или это какой-то символ?

Чтобы решить эту проблему, вы можете использовать /^[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();
            }
        }
    }
-1
задан Sourav Ghosh 16 January 2019 в 06:34
поделиться

3 ответа

для проверки ввода является числовым (с плавающей точкой)

1) Принять ввод в виде строки char buf[Big_Enough]. Я ожидаю, что 160 цифр будут обрабатывать все, кроме самых загадочных «плавающих» строк 1 .

#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 Типичный диапазон float составляет +/- 10 38 . Таким образом, учет 40 или более символов имеет смысл. Точный точный отпечаток FLT_TRUE_MIN может содержать ~ 150 символов. Чтобы отличить произвольно строку «float» от FLT_TRUE_MIN от следующей, более крупной, нужно примерно столько цифр.

Если «плавающие» строки не являются произвольными, а поступают только с выходных данных напечатанного float, тогда требуется намного меньше цифр - около 40.

Конечно, разумно предусмотреть дополнительные начальные / конечные пробелы и нули.

0
ответ дан chux 16 January 2019 в 06:34
поделиться

Вам необходимо принять входные данные как строку , а затем использовать strtod() для анализа входных данных.

Относительно возвращаемых значений, из справочной страницы :

double strtod(const char *nptr, char **endptr);

Эти функции возвращают преобразованное значение, если оно есть.

Если endptr не равно NULL, указатель на символ после последнего символа, использованного в преобразовании, сохраняется в местоположении, указанном в endptr.

Если преобразование не выполняется, возвращается ноль, и значение nptr сохраняется в местоположении, указанном в endptr.

Приступая к точке обнаружения ошибок, пара моментов:

  • Убедитесь, что errno установлено на 0 до вызова, и оно все еще равно 0. после звонка.
  • Возвращаемое значение не HUGE_VAL.
  • Содержимое, на которое указывает *endptr, не является нулевым и не равно nptr (т.е. разговор не был предварительно сформирован).

Вышеупомянутые проверки, объединенные вместе, обеспечат успешное преобразование.

В вашем случае, последняя точка важна, так как если на входе присутствует недопустимый символ, *endptr не будет указывать на ноль, вместо этого он будет содержать адрес этого (первый ) недопустимый символ на входе.

0
ответ дан Sourav Ghosh 16 January 2019 в 06:34
поделиться

Вот непроверенный код для проверки соответствия строки запрошенной спецификации.

#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;
}
0
ответ дан Eric Postpischil 16 January 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: