Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизТут 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c