Как проверить, является ли содержимое переменной числовым? - страница 4

 
Alain Verleyen:
Вы действительно любите усложнения. Если цель - просто обрабатывать вещественные числа, используйте StringToDouble() и обработку специального случая 0.

Это было первоначальное решение:

honest_knave:

Если вы не ожидаете, что значение когда-либо будет равно 0, приведите строку к значению double и проверьте, что оно не равно 0.

Однако ОП хотел иметь возможность различать, было ли 0 введенным значением, или 0 было результатом того, что строка была недопустимым числом. И "0", и "sfdlgkjsflkjdsklfsd" приведут к 0 при использовании StringToDouble() или (double).

Это было неприемлемо для ОП, что и породило последующее обсуждение.

 
honest_knave:

Это было первоначальное решение:

Однако ОП хотел иметь возможность различать, был ли 0 введенным значением, или 0 был результатом того, что строка была недопустимым числом. И "0", и "sfdlgkjsflkjdsklfsd" приведут к 0 при использовании StringToDouble() или (double).

Это было неприемлемо для ОП, что и породило последующее обсуждение.

Вот почему я сказал "и обработка специального случая 0".

Упрощенный пример :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
Вот почему я сказал "и обработка специального случая 0".

Упрощенный пример :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }

А как насчет 0.00?

Или +0.00?

Или 0,0?


honest_knave:

Да, это проблема.

Вы можете сделать сравнение строк, если приведенное значение = 0

т.е. if(cast_value == 0 && str_value == "0").

Но вам придется думать о том, что будет введено 0.0 или 0.00.

Можно разбить строку на символьные массивы и проверить каждый символ.

Зависит от того, насколько это важно.

 
honest_knave:

А как насчет 0.00?

Или +0.00?

Или .0?


Вот почему я сказал "упрощенный пример". Я не буду делать эту работу за ОП.

 
Alain Verleyen:
Вот почему я сказал "упрощенный пример". Я не буду делать работу за ОП.

Это интересное упражнение, тем не менее, т .е. лучше ли иметь список возможных вариаций "0", или просто проверить все?

Первый вариант, вероятно, быстрее, но есть риск пропустить законную вариацию.

Однако, насколько важна скорость, если тестировать нужно только наCHARTEVENT_OBJECT_ENDEDIT?

Независимо от этого, я уверен, что у ОП теперь есть на что ориентироваться!

 
honest_knave:

Это интересное упражнение, тем не менее, т .е. лучше ли иметь список возможных вариаций "0", или просто проверить все?

Первый вариант, вероятно, быстрее, но есть риск пропустить законную вариацию.

Однако, насколько важна скорость, если тестировать нужно только наCHARTEVENT_OBJECT_ENDEDIT?

Независимо от этого, я уверен, что у ОП теперь есть на что ориентироваться!

Вы также можете попросить ввести ноль как "0" и отклонить все остальные случаи.

Или использовать регулярное выражение:-D
 
Alain Verleyen:
Можно также попросить ввести ноль как "0" и отклонить все остальные случаи.

Или использовать регулярное выражение :-D

Лично я бы использовал такой подход:

Как только происходит ENDEDIT, преобразовать OBJ_TEXT в double, а затем вернуть его в поле редактирования в виде строки (используя StringFormat(), если я хочу контролировать формат). Пользователь сразу же увидит результат своих действий и либо изменит его, если он ему не подходит, либо оставит его.

Например.

#property strict

#define EDIT_BOX "EditBox"

int OnInit()
  {
   ObjectCreate    (0, EDIT_BOX, OBJ_EDIT000);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE100);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE,  20);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGNALIGN_CENTER);
   ObjectSetString (0, EDIT_BOX, OBJPROP_TEXT"Enter Value");
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, EDIT_BOX);
  }

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
     }
  }
 
honest_knave:

Лично я бы использовал такой подход:

Как только происходит ENDEDIT, преобразовать OBJ_TEXT в double, а затем вернуть его в поле редактирования в виде строки (используя StringFormat(), если я хочу контролировать формат). Пользователь сразу же увидит результат своих действий и либо изменит его, если он ему не подходит, либо оставит его.

Например.

#property strict

#define EDIT_BOX "EditBox"

int OnInit()
  {
   ObjectCreate    (0, EDIT_BOX, OBJ_EDIT000);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE100);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE,  20);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGNALIGN_CENTER);
   ObjectSetString (0, EDIT_BOX, OBJPROP_TEXT"Enter Value");
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, EDIT_BOX);
  }

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
     }
  }

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

Будьте проще. В общем, как пожелаете :p

 
Alain Verleyen:

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

Я не уверен, что понимаю...?

Возможно, я неправильно понял намерения ОП, но я полагаю, что интерфейс будет динамическим, т.е. изменение в этом поле редактирования приведет к обновлению другого поля соответственно.

Вы можете иметь кнопку проверки, но если результат будет просто отображаться (а не действовать), это может быть ненужным дополнением. Но я не уверен - ОП должен уточнить.

Ален Верлейен:

Будьте проще. В общем, как хотите :p

Я очень согласен с тем, чтобы все было просто. Разве можно быть проще, чем это?

      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);

PS Я не уверен, что это то, что я хочу, это просто академическая дискуссия для меня - мне это не нужно!

 
honest_knave:

Я не уверен, что понимаю...?

...
Честно говоря, я понятия не имею о намерениях ОП
Если рассматривать это как общий запрос: "Как проверить, является ли содержимое переменной числовым?", то наиболее элегантным решением является использование регулярного выражения.
Причина обращения: