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

 
Alain Verleyen:
Честно говоря, я понятия не имею о намерениях ОП.
Если рассматривать это как общий запрос: "Как проверить, является ли содержимое переменной числовым?", то самым элегантным решением будет использование регулярного выражения.
 
Google - ваш друг! Вот ссылка на реализацию "IsNumeric" на многих, многих языках, включая C и C++ (но без MQL).

А вот еще один, который кажется более полным (в самом конце страницы):

Determine if a string is numeric - Rosetta Code
Determine if a string is numeric - Rosetta Code
  • rosettacode.org
Create a boolean function which takes in a string and tells whether it is a numeric string (floating point and negative numbers included) in the syntax the language uses for numeric literals or numbers converted from strings. The first file is the package interface containing the declaration of the Is_Numeric function. The second file is the...
 
Alain Verleyen:
Честно говоря, я понятия не имею о намерениях ОП
Если рассматривать это как общий запрос: "Как проверить, является ли содержимое переменной числовым?", то наиболее элегантным решением будет использование регулярного выражения.
Моим намерением является общий запрос, который вы предположили - если число является числовым, то оно является числовым и может быть использовано для разумного вычисления без какой-либо формы ошибки, вытекающей из природы чисел. Приведите пример кода на MQL4, связанного с регулярными выражениями.
 
Да, ОП сейчас здесь, и он слышит и видит все решения и контррешения, которые были предложены до сих пор. Я ценю усилия всех тех, кто комментировал. Мне нравятся примеры кодов, представленные honest_knave. Во-первых, он все время подкреплял свои комментарии кодами. Во-вторых, ни в одном из его примеров не было жесткого кодирования. Более того, его коды легко справляются с любой формой нуля (0, 0.0, 0.00, .0 и т.д.), и их легко понять. Я не думаю, что использование StringToDouble() лучше, в любом случае.

Спасибо всем @ whroeder1, honest_knave, Ernst Van Der Merwe, Alain Verleyen и Fernando Carreiro.
 
honest_knave:

Итак:

  • Передайте строку по ссылке
  • Вычеркните пробелы
  • Вычеркните ','
  • Проверьте, что есть только один символ '.'
  • Проверьте, что '+' или '-' появляются только в качестве первого символа.
  • Проверьте, что каждый второй символ - это число от 0 до 9.

например.

bool IsValidNumber(string &text)
  {
   StringReplace(text," ",NULL);
   StringReplace(text,",",NULL);
   int point_cnt = 0;
   for(int i=StringLen(text)-1; i>=0; i--)
     {
      int this_char = StringGetChar(text,i);
      if(this_char == '.')
        {
         point_cnt++;
         if(point_cnt>1)       return(false);
         if(StringLen(text)<2) return(false);
        }
      else if(this_char == '+' || this_char == '-')
        {
         if(i>0) return(false);
        }
      else if(this_char < '0' || this_char > '9') return(false);
     }
   return(true);
  }

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

Но есть еще несколько вещей, которые нам нужно проверить. Хотя нам нужно проверить, что '+' или '-' появляется в качестве первого символа, нам также нужно проверить, что он не один.
 
honest_knave:

Итак:

  • Передайте строку по ссылке
  • Вычеркните пробелы
  • Вычеркните ','
  • Проверьте, что есть только один символ '.'
  • Проверьте, что '+' или '-' появляются только в качестве первого символа.
  • Проверьте, что каждый второй символ - это число от 0 до 9.

например.

bool IsValidNumber(string &text)
  {
   StringReplace(text," ",NULL);
   StringReplace(text,",",NULL);
   int point_cnt = 0;
   for(int i=StringLen(text)-1; i>=0; i--)
     {
      int this_char = StringGetChar(text,i);
      if(this_char == '.')
        {
         point_cnt++;
         if(point_cnt>1)       return(false);
         if(StringLen(text)<2) return(false);
        }
      else if(this_char == '+' || this_char == '-')
        {
         if(i>0) return(false);
        }
      else if(this_char < '0' || this_char > '9') return(false);
     }
   return(true);
  }

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

Похоже, я решил проблему (отдельно '+' или '-'), добавив/изменив код (коды в ячейках). См. изображение ниже.