Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы действительно любите усложнения. Если цель - просто обрабатывать вещественные числа, используйте StringToDouble() и обработку специального случая 0.
Это было первоначальное решение:
Если вы не ожидаете, что значение когда-либо будет равно 0, приведите строку к значению double и проверьте, что оно не равно 0.
Однако ОП хотел иметь возможность различать, было ли 0 введенным значением, или 0 было результатом того, что строка была недопустимым числом. И "0", и "sfdlgkjsflkjdsklfsd" приведут к 0 при использовании StringToDouble() или (double).
Это было неприемлемо для ОП, что и породило последующее обсуждение.
Это было первоначальное решение:
Однако ОП хотел иметь возможность различать, был ли 0 введенным значением, или 0 был результатом того, что строка была недопустимым числом. И "0", и "sfdlgkjsflkjdsklfsd" приведут к 0 при использовании StringToDouble() или (double).
Это было неприемлемо для ОП, что и породило последующее обсуждение.
Упрощенный пример :
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
Вот почему я сказал "и обработка специального случая 0".
Упрощенный пример :
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
А как насчет 0.00?
Или +0.00?
Или 0,0?
Да, это проблема.
Вы можете сделать сравнение строк, если приведенное значение = 0
т.е. if(cast_value == 0 && str_value == "0").
Но вам придется думать о том, что будет введено 0.0 или 0.00.
Можно разбить строку на символьные массивы и проверить каждый символ.
Зависит от того, насколько это важно.
А как насчет 0.00?
Или +0.00?
Или .0?
Вот почему я сказал "упрощенный пример". Я не буду делать работу за ОП.
Это интересное упражнение, тем не менее, т .е. лучше ли иметь список возможных вариаций "0", или просто проверить все?
Первый вариант, вероятно, быстрее, но есть риск пропустить законную вариацию.
Однако, насколько важна скорость, если тестировать нужно только наCHARTEVENT_OBJECT_ENDEDIT?
Независимо от этого, я уверен, что у ОП теперь есть на что ориентироваться!
Это интересное упражнение, тем не менее, т .е. лучше ли иметь список возможных вариаций "0", или просто проверить все?
Первый вариант, вероятно, быстрее, но есть риск пропустить законную вариацию.
Однако, насколько важна скорость, если тестировать нужно только наCHARTEVENT_OBJECT_ENDEDIT?
Независимо от этого, я уверен, что у ОП теперь есть на что ориентироваться!
Или использовать регулярное выражение:-D
Можно также попросить ввести ноль как "0" и отклонить все остальные случаи.
Или использовать регулярное выражение :-D
Лично я бы использовал такой подход:
Как только происходит ENDEDIT, преобразовать OBJ_TEXT в double, а затем вернуть его в поле редактирования в виде строки (используя StringFormat(), если я хочу контролировать формат). Пользователь сразу же увидит результат своих действий и либо изменит его, если он ему не подходит, либо оставит его.
Например.
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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);
}
}
Лично я бы использовал такой подход:
Как только происходит ENDEDIT, преобразовать OBJ_TEXT в double, а затем вернуть его в поле редактирования в виде строки (используя StringFormat(), если я хочу контролировать формат). Пользователь сразу же увидит результат своих действий и либо изменит его, если он ему не подходит, либо оставит его.
Например.
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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
Вам потребуется способ проверки вводимых данных. (дополнительная кнопка?)
Я не уверен, что понимаю...?
Возможно, я неправильно понял намерения ОП, но я полагаю, что интерфейс будет динамическим, т.е. изменение в этом поле редактирования приведет к обновлению другого поля соответственно.
Вы можете иметь кнопку проверки, но если результат будет просто отображаться (а не действовать), это может быть ненужным дополнением. Но я не уверен - ОП должен уточнить.
Будьте проще. В общем, как хотите :p
Я очень согласен с тем, чтобы все было просто. Разве можно быть проще, чем это?
ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
PS Я не уверен, что это то, что я хочу, это просто академическая дискуссия для меня - мне это не нужно!
Я не уверен, что понимаю...?
...Если рассматривать это как общий запрос: "Как проверить, является ли содержимое переменной числовым?", то наиболее элегантным решением является использование регулярного выражения.