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

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

Тут 2 поста натолкнули на вопрос [D6, D7, Win2k, WinXP]


П7 ©   (2004-10-13 18:14:00) 

Уважаемые Мастера!
Допустим у меня есть строка 'dfgh 97458fdgh'. Я хочу перевести её в число. Т.е. отбросить все буквы, а затем StrToInt.
В принципе можно решить это перебором символов и их анализом. Но может быть есть другой способ?
И вот ещё пример, строка 'iuhfd 456sdfgh 8765sreg'
На выходе нужно бы поиметь уже 2 числа. Или одно, с отброшенной буквеной частью, как бы слить 2 и более числовые части и конвертнуть. Т.е. вариантов можно придумать много... (:

Какие-нибудь мысли на этот счёт?


ЮрийК   (2004-10-13 20:19:00) [1]

for i := 1 to length(s) do begin
if (s[i] in ['0'..'9']) then result := result*10 + Ord(s[i]) - 48;
end;


ЮрийК   (2004-10-13 20:17:00) [2]

Result: Integer;
Result := 0;
if (s[i] in ['0'..'9') then result := result*10 + Ord(s[i]) - 48;

Если только '0' 48 номер в таблице символов, нужно проверить.


begin...end   (2004-10-13 19:34:00) [3]


> [10] Defunct ©   (13.10.04 19:33)

Понятно.


Defunct   (2004-10-13 19:33:00) [4]

> begin...end ©   (13.10.04 19:15) [7]

Для Stringне обязательно. компилятор Delphi сам инициализирует строку (Result) значением '' о чем говорит команда Push 0. Для ShortString инициализация необходима.

Ну а чтобы не было путаницы и была совместимость с TP и FreePascal почему бы в общем случае не инициализировать строку дополнительно?


begin...end   (2004-10-13 19:33:00) [5]


> [9] TUser ©   (13.10.04 19:25)

Это Вы к чему? Чем это лучше [6], например?
И причём здесь DecimalSeparator? В вопросе было: отбросить все буквы.


TUser   (2004-10-13 19:25:00) [6]

state = false;
S:=S+'!';
for i:=1 to length(S) do
case state of
true:
if (S[i] in '0'..'9']) or
 ((S[i] = DecimalSeparator) and not HasDC) then
buf:=buf+S[i]
else begin
state:=false;
HasDS:=HasDC or (S[i] = DecSep);
try
MyF:=StrToFloat(buf);
showmessage(Format('%.3f',[MyF]));
except
end;
end;
false:
if (S[i] in ['0'..'9','-']) or
 (S[i] = DecimalSeparator) then begin
state:=true;
HasDS:=S[i]=DecSep;
buf:=S[i];
end;
end;


TUser   (2004-10-13 19:24:00) [7]

state = false;
S:=S+'!';
for i:=1 to length(S) do
case state of
true:
if (S[i] in '0'..'9']) or
  ((S[i] = DecimalSeparator) and not HasDC) then
buf:=buf+S[i]
else begin
state:=false;
try
MyF:=StrToFloat(buf);
showmessage(Format('%.3f',[MyF]));
except
end;
end;
false:
if (S[i] in ['0'..'9','-']) or
  (S[i] = DecimalSeparator) then begin
state:=true;
HasDS:=S[i]=DecSep;
buf:=S[i];
end;
end;

Если все чила целые - тогда еще проще.


begin...end   (2004-10-13 19:15:00) [8]


> Defunct ©   (13.10.04 19:11)


Кстати, скажите, строку вначале нужно инициализировать (Result := '')?
Когда-то здесь этот вопрос обсуждался, но не помню, чем кончилось.


Defunct   (2004-10-13 19:13:00) [9]

эхххх...
внимательность просто на нуле..
[5]

const  Digits : set of char = ['0'..'9'];

Function Str2Digits(S: String):String;
Var I:Integer;
Begin
Result := '';
For I:=1 To Length(S) Do
  If S[i] in Digits Then Result := Result + S[i];
End;


Defunct   (2004-10-13 19:11:00) [10]

> Какие-нибудь мысли на этот счёт?

const  Digits : set of char = ['0'..'9'];

Function Str2Digits(S: String):String;
Var I:Integer;
Begin
 Result := '';
 For I:=0 To Length(S)-1 Do
   If S[i] in Digits Then Result := Result + S[i];
End;


Romkin   (2004-10-13 19:10:00) [11]


Result := 0;
s := 'iuhfd456sdfgh8765sreg';
for i := 1 to length(s) do
begin
 val(S, N, Code);
 if Code = 0 then
 begin
   Result := N;
   break;
 end
 else
   delete(S, Code, 1);
end;


Ega23   (2004-10-13 18:29:00) [12]

Перебор. Писключительно Перебор.


Jeer   (2004-10-13 18:26:00) [13]

Интересно, а какой "другой анализ" догадается из каких символов может состоять строка ?
Даже если говорить об Regexp, то все равно перебор хоть и скрытый.


begin...end   (2004-10-13 18:23:00) [14]


> На выходе нужно бы поиметь уже 2 числа. Или одно, с отброшенной
> буквеной частью, как бы слить 2 и более числовые части и
> конвертнуть.

А надо-то как?


Наверх

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