Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Строку в число


Автор: supervladislav 9.10.2012, 18:35
Подскажите можно ли с помощью данного оператора проверять является ли возвращаемый результат или переменная тем или иным типом данных.
Я имею ввиду string,integer.

Автор: supervladislav 9.10.2012, 19:44
что-то вроде 
Код

 if lcbtd.Text is strs then

мне нужно узнать является ли результат типа стринг ,данную задачу можно решить с помощью 
оператора is
Код

lcbtd.Text

Автор: kami 9.10.2012, 23:40
Дружище, выражая исключительно свое мнение и действуя в состоянии небольшого аффекта под воздействием энного количества пива, вынужден сообщить нижеследующее - ты изрядно достал как минимум по двум причинам. 
  Первая: все советы тебе отложить форум в сторону и почитать какую-нибудь книгу пропали втуне. Ибо если бы ты почитал первую главу любой книжки, то знал бы, что Delphi - язык строгой типизации и в нем фокусы типа "string = integer" не работают. И самое главное - обо всем этом заботится компилятор, который своевременно даст по рукам за подобное. Резюмируя первую причину, если поле lcbtd.Text типа string, то компилятор не даст совершить с ним ничего не-стрингового. Всякие is и as здесь излишни. Я не думаю, что ты успел добраться до RTTI, Variant-ов или работы с указателями.
  Вторая: все пожелания излагать задачу, которую нужно решить, а не странным образом изложенный непонятный кусок из нее, опять-таки канули в Лету. Интересно, кто на этот раз возьмется решать "xyz"?

Модераторам: готов понести наказание за это высказывание, но сил молчать больше нет.

Автор: Данкинг 10.10.2012, 00:39
Цитата(supervladislav @  9.10.2012,  19:35 Найти цитируемый пост)
является ли возвращаемый результат или переменная тем или иным типом данных.

Возвращаемый чем?

Автор: northener 10.10.2012, 00:42
Цитата(supervladislav @  9.10.2012,  18:35 Найти цитируемый пост)
Подскажите можно ли с помощью данного оператора проверять является ли возвращаемый результат или переменная тем или иным типом данных.
Я имею ввиду string,integer. 

Нет. Оператор is работает только с классами.

Автор: northener 10.10.2012, 01:18
Цитата(supervladislav @  9.10.2012,  19:44 Найти цитируемый пост)
то-то вроде 
Выделить всёкод Pascal/Delphi
1:
    
 if lcbtd.Text is strs then

мне нужно узнать является ли результат типа стринг ,данную задачу можно решить с помощью 
оператора is

Это опять не задача. Это опять "глупый" вопрос!
lcbtd.Text вседа имеет тип String.

Автор: supervladislav 10.10.2012, 03:23
Ой я имел ввиду текстовое поле типа Edite

Добавлено @ 03:25
northener, Это не глупый вопрос так как мне не очень понятно ,как в чётко типизированном языке проверить является ли  значение добовляемое в поле edite числовым или числовым дробным.
Я теперь понимаю ,что не через тип.
Но как регулярным выражением ,неучто в такой мощной машине как Делпхи Нет другово варианта?

Автор: northener 10.10.2012, 03:34
Цитата(supervladislav @  10.10.2012,  03:23 Найти цитируемый пост)
northener, Это не глупый вопрос так как мне не очень понятно ,как в чётко типизированном языке проверить является ли  значение добовляемое в поле edite числовым или числовым дробным.

В "чётко типизированном языке в поле Edit" всегда пишется текст! Только текст! И ничего кроме текста!

Автор: supervladislav 10.10.2012, 03:45
northener, а если данные этого поля  будут складываться или вычитаться?

Автор: MetalFan 10.10.2012, 07:33
supervladislav, почитайте, что http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types. вычитаться строки не могут. но строку всегда можно ПОПРОБОВАТЬ перевести в число...

Автор: Данкинг 10.10.2012, 11:07
Цитата(supervladislav @  10.10.2012,  04:45 Найти цитируемый пост)
а если данные этого поля  будут складываться или вычитаться? 

Тогда тебе поможет одна из функций перевода, например, StrToInt.

Автор: Delvish 10.10.2012, 13:09
Цитата(Данкинг @  10.10.2012,  12:07 Найти цитируемый пост)
Тогда тебе поможет одна из функций перевода, например, StrToInt.


и засунуть это дело в try ... except .. end; дабы видеть результат или невозможность выполнения действия

Автор: superVad 10.10.2012, 14:14
Код

Delphi syntax:

function TryStrToInt(const S: string; out Value: Integer): Boolean;


Description

TryStrToInt converts the string S, which represents an integer-type number in either decimal or hexadecimal notation, into a number, which is assigned to Value. If S does not represent a valid number, TryStrToInt returns false; otherwise TryStrToInt returns true.

Автор: Delvish 10.10.2012, 14:26
ну или так smile и не используя лишних модулей можно ее же описать старой паскалевской функцией Val в своей функции
Код

function TryStrToInt(S : string; var o : Real) : boolean;
var
  t : Real;
  e : Integer;
begin
  Val(S, t, e);
  if e = 0 then 
   begin
    o := t;
    Result := True;
   end else
    Result := False;
end;

Автор: superVad 10.10.2012, 17:21
Цитата(Delvish @  10.10.2012,  13:26 Найти цитируемый пост)
ну или так  и не используя лишних модулей можно ее же описать старой паскалевской функцией Val в своей функции

Можно и машинными кодами писать smile
Но все же - TryStrToInt - это стандартная делфевая функция.

Автор: supervladislav 10.10.2012, 18:20
Delvish, когда человек введёт текст ,что будет ,как отследить момент когда человек в функцию вводит текст 

Автор: Данкинг 10.10.2012, 18:47
Цитата(supervladislav @  10.10.2012,  19:20 Найти цитируемый пост)
как отследить момент когда человек в функцию вводит текст  

Можешь на этапе нажатия клавиш на Edit отлавливать. Можешь проверять с помощью вышеуказанных способов отлова ошибок.

Автор: superVad 10.10.2012, 19:05
Цитата(supervladislav @  10.10.2012,  17:20 Найти цитируемый пост)
Delvish, когда человек введёт текст ,что будет ,как отследить момент когда человек в функцию вводит текст 

Какой то поток сознания.
Рекомендую - http://ru.wikipedia.org/wiki/Метод_утёнка.

Автор: supervladislav 10.10.2012, 22:21
superVad, Я просто думал ,что тут тоже программисты и смогут поделиться хотябы той литературой которую они читали.
С большим колличеством примеров , но такого я не нашёл.
Мне было не очень понятно какие данные проверять ,чтобы выяснить что пользователь ввёл не число ?

Автор: Данкинг 10.10.2012, 23:08
Цитата(supervladislav @  10.10.2012,  23:21 Найти цитируемый пост)
Мне было не очень понятно какие данные проверять ,чтобы выяснить что пользователь ввёл не число ?

Код

try
 sss:=strtoint(edit1.text);
 showmessage('Введено число');
except
 showmessage('Ошибка преобразования');
end;

Автор: supervladislav 10.10.2012, 23:13
Данкинг, а где сам цикл if else?

Автор: Данкинг 10.10.2012, 23:49
Зачем здесь "цикл", как ты его называешь, if else? Здесь если strtoint не вызывает ошибки, то выводится "Введено число". Если же возникает ошибка, то программа переходит в блок, следующий после except, и выводится " "Ошибка преобразования".

Автор: northener 11.10.2012, 00:44
Цитата(superVad @  10.10.2012,  17:21 Найти цитируемый пост)
Можно и машинными кодами писать smile
Но все же - TryStrToInt - это стандартная делфевая функция. 

Но Val - это "ещё более стандартная" процедура Дельфи.  Скажу более. Она использует тот самый Compile Magic. А функция TryStrToInt как раз и использует процедуру Val. См. исходники Дельфи. В них тоже самое, что в посте Delvish, но гораздо элегантнее. И без ошибки в типе второго параметра.

P.S.
  Функции TryStrTo... значительно менее функциональны, чем процедура Val. Во-первых они преобразовывают строку только в жестко заданный тип числовой переменной. А во-вторых (и в этом особый цимус) процедура Val показывает в каком символе входного параметра-строки ошибка! Что даёт возможность показать пользователю, где он при ручном вводе сделал ошибку. Ну точнее - где он сделал первую из своих ошибок ввода.

Автор: northener 11.10.2012, 01:12
Цитата(supervladislav @  10.10.2012,  22:21 Найти цитируемый пост)
Я просто думал ,что тут тоже программисты и смогут поделиться хотябы той литературой которую они читали.
С большим колличеством примеров , но такого я не нашёл.


Тут тоже программисты. Но далеко не все из них учились методом "подгонки готовых примеров под свою задачу".
Даже скажу что таких - меньшинство. Я знаю только одного.

Автор: bems 11.10.2012, 03:46
Использование StrToXXX когда нет уверенности что в строке число в нужном формате это нецелевое использование исключений, годится только для плохих студентов, которым сдать лабу и забыть. Правильный вариант TryStrToXXX, ну или Val, если вы не можете смириться с показаниями календаря

Автор: Delvish 11.10.2012, 10:52
Цитата(northener @  11.10.2012,  01:44 Найти цитируемый пост)
Но Val - это "ещё более стандартная" процедура Дельфи.  Скажу более. Она использует тот самый Compile Magic. А функция TryStrToInt как раз и использует процедуру Val. См. исходники Дельфи. В них тоже самое, что в посте Delvish, но гораздо элегантнее. И без ошибки в типе второго параметра.P.S.  Функции TryStrTo... значительно менее функциональны, чем процедура Val. Во-первых они преобразовывают строку только в жестко заданный тип числовой переменной. А во-вторых (и в этом особый цимус) процедура Val показывает в каком символе входного параметра-строки ошибка! Что даёт возможность показать пользователю, где он при ручном вводе сделал ошибку. Ну точнее - где он сделал первую из своих ошибок ввода.


это я и имел ввиду - TryStr.. основывается на старом-добром Val, в котором 2й параметр можно задать натуральным либо вещественным типом в зависимости от того, какой результат хочется увидеть. и да, плюс ко всему - это третий параметр с порядковым номером ошибочного символа, если он присутствует

Автор: northener 11.10.2012, 12:24
Вот ведь как забавно!
Исторически в турбо паскале существовала процедура Val не вызывавшая ошибок времени исполнения (runtime error). При рождении Дельфи для этой процедуры сделали обертку, которая стала такие ошибки (теперь они называются exception) выдавать:
Код

function StrToInt(const S: string): Integer;
var
  E: Integer;
begin
  Val(S, Result, E);
  if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;

И понадобилось еще лет 10, чтобы к той самой процедуре Val сделали новую обертку, которая вновь не вывает ошибок:
Код

function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
  E: Integer;
begin
  Val(S, Value, E);
  Result := E = 0;
end;


Неисповедимы пути твои, господи. smile

Автор: supervladislav 11.10.2012, 20:56
northener, Если человек изучает с ноля с минимум примеров , а вы изучали сами или вас застовляли?

Добавлено через 22 секунды
ПРостой толковой литературы маловато пока.

Автор: northener 12.10.2012, 01:06
Цитата(supervladislav @  11.10.2012,  20:56 Найти цитируемый пост)
northener, Если человек изучает с ноля с минимум примеров , а вы изучали сами или вас застовляли?

Меня никто не застАвлял. Учился почти совсем без примеров. Но Аглицкий Технический знал, так что мог читать хелп. Если он был, конечно smile

P.S. Да ради бога. Изучай с ноля и без примеров.
Но, пожалуйста, пойми одну простую вещь. Если мне когда-нибудь придётся что-то делать на php, я не стану на форумах задавать "умные" вопросы. Я просто скажу,что php я не знаю. А мне нужно сделать, чтобы моя програмима делала то-то и то-то. Что из некоторых соображений я пытаюсь сделать так (тут кусок кода), но у меня не получается. Помогите исправить мои ошибки!

Автор: spindul 13.10.2012, 21:56
Цитата(supervladislav @  11.10.2012,  20:56 Найти цитируемый пост)
ПРостой толковой литературы маловато пока. 

Ну по-моему литературы простой по Delphi предостаточно, взять того же Фленова "Библия Delphi" написана доступным и понятным языком, что даже дитё разберется

Автор: northener 14.10.2012, 01:49
Цитата(spindul @  13.10.2012,  21:56 Найти цитируемый пост)
взять того же Фленова "Библия Delphi"

Не надо её брать, пожалуйста! Эта книга написана троешником, чем сам автор даже гордится.

Автор: spindul 14.10.2012, 11:23
Цитата(northener @  14.10.2012,  01:49 Найти цитируемый пост)
Не надо её брать, пожалуйста! Эта книга написана троешником, чем сам автор даже гордится. 

Да она написана троешником, но по крайней мере там есть примеры и разжевано всё чуть ли не досконально,  я не говорю что это лучшая книга по Delphi, но для начала она сойдет.

Автор: bems 14.10.2012, 13:17
Ничего там не разжевано

Автор: spindul 14.10.2012, 14:16
Цитата(bems @  14.10.2012,  13:17 Найти цитируемый пост)
Ничего там не разжевано 

что не понятно можно было и в других книгах глянуть, не считаю это проблемой

Автор: northener 15.10.2012, 01:00
Цитата(spindul @  14.10.2012,  14:16 Найти цитируемый пост)
что не понятно можно было и в других книгах глянуть

Ну тогда дай другой пример учебника по Дельфи на русском.

Автор: spindul 15.10.2012, 17:54
Цитата(northener @  15.10.2012,  01:00 Найти цитируемый пост)
Ну тогда дай другой пример учебника по Дельфи на русском. 

рубанцева с особым интересом почитал, графику у осипова. Да я и не обязательно говорю о учебниках на русском, можно и на английском читать, вроде проблем нет особых

Автор: northener 16.10.2012, 00:59
Цитата(spindul @  15.10.2012,  17:54 Найти цитируемый пост)
Да я и не обязательно говорю о учебниках на русском, можно и на английском читать, вроде проблем нет особых 

У автора темы как раз есть проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)