![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка числового значения
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