Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проверка числового значения


Страницы:   1 2

wewill ©   (2006-10-17 19:38:00) 

Есть такая тривиальная задача: необходимо проверить стринговую переменную, является ли её значение числом. На мой взгляд это всё решается как то приблизительно так:
function IsNumber(s: string): Boolean;
var
 i: Integer;
begin
 Result := False;
 for i := 1 to Length(s) do
   case s[i] of '0'..'9':;
    else Exit;
   end;
 Result := True;
end;


Но залез в гугл, я обнаружил ещё интересный способ:
function IsNumber(mStr: string): Boolean;
var
 I: Real;
 E: Integer;
begin
 Val(mStr, I, E);
 Result := E = 0;
 E := Trunc(I);
end;


Что лучше?


Рамиль   (2006-10-18 09:13:00) [1]


> RASkov   (17.10.06 23:15) [22]

http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82
Это мирное "устройство" :)


Loginov Dmitry   (2006-10-18 07:42:00) [2]

@!!ex ©   (17.10.06 21:53) [19]
А нас в вузе пинают, если мы используем Exit, Break, Continue


Забыл как-то спросить разрешения у вашего вуза, что использовать, как и использовать и где использовать.


RASkov   (2006-10-17 23:15:00) [3]

> [21] Рамиль ©   (17.10.06 22:55)

Это какой еще автомат?, надо мирно цифиру вычислить:)


Рамиль   (2006-10-17 22:55:00) [4]

Если пошла такая пьянка,то через конечный атомат надо разбирать :o)


RASkov   (2006-10-17 22:13:00) [5]

> тело except -- лишнее. переменная -- лишняя. про TryStrToInt()
> тоже не помним. низачот, короче.

Ну если в начале Result:=False; убрать (забыл:)


> TryStrToInt


> IsNumber('4294967298')=False

Тогда TryStrToInt64:)


> [5] Palladin ©   (17.10.06 20:26)
> [6] Ketmar ©   (17.10.06 20:34)

Придирка... у автора в коде не было проверок на точку:)


> Мне надо любое текстовое выражение, состоящее из чисел -
> считать числом. Т.е. 4096 циферок - тоже число.

Это можно как понять т.е. если в строке сожержится число то его вернуть отбросив ненужные символы?


> А нас в вузе пинают, если мы используем Exit, Break, Continue
> и т.д.... :\

А зачем их тогда придумали? а я вот так делаю:

for n := 0 to 10 do begin
if n = 5 then Continue;
<какие то действия>
end;

Ну не надо мне обработку при n=5.


@!!ex   (2006-10-17 21:53:00) [6]


> Loginov Dmitry ©   (17.10.06 20:44) [12]

А нас в вузе пинают, если мы используем Exit, Break, Continue и т.д.... :\


Kolan   (2006-10-17 21:04:00) [7]


> Мне надо любое текстовое выражение, состоящее из чисел -
>  считать числом. Т.е. 4096 циферок - тоже число.

Афтару только кажется, что ему это надо, думаю [17] хватит...


Ketmar   (2006-10-17 20:57:00) [8]

>[16] Kolan(c) 17-Oct-2006, 20:56
>Тем более TryStrToFloat. Что еще надо?
[8] пролетает.


Kolan   (2006-10-17 20:56:00) [9]

Тем более TryStrToFloat. Что еще надо?


Ketmar   (2006-10-17 20:52:00) [10]

>[14] Kolan(c) 17-Oct-2006, 20:50
>Может есть
> TryStringToFloat?
может, справка расскажет?


Kolan   (2006-10-17 20:50:00) [11]

Result := True;
try
 StringToFloat(S);
except
 Result := False;
end;  


Ну с дробными и отрицательными числами будет несколько сложнее, т.е. нужно учитывать, что знак минус может стоять вначале числа, а не абы как, в действительном числе может быть не 2-х знаков "-", не более 1-го символа ".", может присутствовать символ "Е".
Это все учтеться.

Может есть
TryStringToFloat?


Palladin   (2006-10-17 20:45:00) [12]


> [9] Leonid Troyanovsky

скорее размер строкового представления... раз 4096 циферек


Loginov Dmitry   (2006-10-17 20:44:00) [13]

ну тады

Result := False;

for I := 1 to Length(S) do
 if not S[I] in ['0'..'9'] then
   Exit;

Result := True;


Ну с дробными и отрицательными числами будет несколько сложнее, т.е. нужно учитывать, что знак минус может стоять вначале числа, а не абы как, в действительном числе может быть не 2-х знаков "-", не более 1-го символа ".", может присутствовать символ "Е".


Kolan   (2006-10-17 20:44:00) [14]

StringToFloat


Palladin   (2006-10-17 20:44:00) [15]

хм... иногда, когда дверь мерзнет/клинит, приходится лазать и через багажник

только немного измененный

Function IsNumber(Const s:String):Boolean;
Var
i:Integer;
begin
Result:=False;
If (s<>'') and (Not (s[1] in ['0'..'9','+','-'])) Then Exit;
For i:=2 to Length(s) do
 If Not (s[i] in ['0'..'9']) Then Exit;
Result:=True;
End;


Leonid Troyanovsky   (2006-10-17 20:40:00) [16]


> wewill   (17.10.06 20:36) [8]

>  считать числом. Т.е. 4096 циферок - тоже число.


+4.0E-96 -число?

--
Regards, LVT.


wewill   (2006-10-17 20:36:00) [17]

Мне надо любое текстовое выражение, состоящее из чисел - считать числом. Т.е. 4096 циферок - тоже число.


Leonid Troyanovsky   (2006-10-17 20:36:00) [18]


> Ketmar ©   (17.10.06 20:25) [4]

> тело except -- лишнее. переменная -- лишняя.


Да, вообще, приведенное - лишнее, бо, скажем,
Val работает как с Integer, так и Float.
И не возбуждает исключений всуе.

--
Regards, LVT.


Ketmar   (2006-10-17 20:34:00) [19]

кстати, не озвучено, считать ли числами дроби. и если да -- то в какой форме. а строку из 4096 цифирок числом считать? или белибердой? мрак.


Palladin   (2006-10-17 20:26:00) [20]


> [3] RASkov

ай ай ай. не хорошо.

IsNumber('4294967298')=False


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо