Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Тут 2 поста натолкнули на вопрос   Найти похожие ветки 

 
П7   (2004-10-13 18:14) [0]

Уважаемые Мастера!
Допустим у меня есть строка "dfgh97458fdgh". Я хочу перевести её в число. Т.е. отбросить все буквы, а затем StrToInt.
В принципе можно решить это перебором символов и их анализом. Но может быть есть другой способ?
И вот ещё пример, строка "iuhfd456sdfgh8765sreg"
На выходе нужно бы поиметь уже 2 числа. Или одно, с отброшенной буквеной частью, как бы слить 2 и более числовые части и конвертнуть. Т.е. вариантов можно придумать много... (:

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


 
begin...end ©   (2004-10-13 18:23) [1]


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

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


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

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


 
Ega23 ©   (2004-10-13 18:29) [3]

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


 
Romkin ©   (2004-10-13 19:10) [4]


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;


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

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

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;


 
Defunct ©   (2004-10-13 19:13) [6]

эхххх...
внимательность просто на нуле..
[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;


 
begin...end ©   (2004-10-13 19:15) [7]


> Defunct ©   (13.10.04 19:11)


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


 
TUser ©   (2004-10-13 19:24) [8]

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;

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


 
TUser ©   (2004-10-13 19:25) [9]

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;


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

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

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

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


 
begin...end ©   (2004-10-13 19:33) [11]


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

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


 
begin...end ©   (2004-10-13 19:34) [12]


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

Понятно.


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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
6-1089808425
Dimman
2004-07-14 16:33
2004.10.31
Ограничение скорости пересылки файла по локалке


8-1091459942
Driver
2004-08-02 19:19
2004.10.31
Вывод звука


14-1097490812
TUser
2004-10-11 14:33
2004.10.31
Кто просил веселых программистов?


9-1087559839
Sormy
2004-06-18 15:57
2004.10.31
AI


3-1096217761
Zif
2004-09-26 20:56
2004.10.31
Как связать 2 таблицы...