![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копирование нестандартной длины строки [D6, Win95/98, WinXP]
Yurij-7 © (2005-02-23 16:44:00)Господа прошу помочь в следующей ситуации:
есть строка вида : "обороты 2180."
как из нее вытянуть только числовую векличину, в данном случае 2180, но может быть и 3 числа в конце строки.
Спасибо.
Antonn (2005-02-23 17:54:00) [21]olookin © (23.02.05 17:49) [27]
А при конвертации строки сепаратором является тот, которрый указан в DecimalSeparator. Так что разделителем может быть хоть символ "%"... Лишь бы это было учтено...
значит нужно еще прогнать строку и назначить сепаратор? А не накладно-ли?
begin...end (2005-02-23 17:53:00) [22]> olookin © (23.02.05 17:50) [28]
Множество или case.
Yurij-7 (2005-02-23 17:50:00) [23]Всем большое спасибо, разобрался.
olookin (2005-02-23 17:50:00) [24][26] begin...end © (23.02.05 17:42)
>>Каждый символ искать во всей строке - медленно.
Варианты какие есть?
olookin (2005-02-23 17:49:00) [25][25] Antonn © (23.02.05 17:41)
А при конвертации строки сепаратором является тот, которрый указан в DecimalSeparator. Так что разделителем может быть хоть символ "%"... Лишь бы это было учтено...
begin...end (2005-02-23 17:42:00) [26]> Antonn © (23.02.05 17:27) [16]
Нагляднее использовать не коды символов, а сами символы:
case s[i] of
'0'..'9' : ...
...
end.
> olookin © (23.02.05 17:33) [21]
> olookin © (23.02.05 17:36) [22]
1. В Pos параметры перепутаны местами.
2. Каждый символ искать во всей строке - медленно.
> Antonn © (23.02.05 17:36) [23]
> еще try..except вроде ставить надо для приличия. Или
> не стоит?
Стоит. Или см. [20].
Я бы использовал множества: if s[i] in ['0'..'9', DecimalSeparator] then ... ну и последнюю точку как-то учитывал.
Antonn (2005-02-23 17:41:00) [27]olookin © (23.02.05 17:36) [22]
DecimalSeparator;
а если у него в тексте этот сепаратор другой?
olookin (2005-02-23 17:37:00) [28]Нет, счастье не придет. Если не поменять z и s[i] местами... Хе-хе
Antonn (2005-02-23 17:36:00) [29]olookin © (23.02.05 17:33) [21]
яж "на коленке писал". {if length} - это не стертый кусок проверки длины начальной строки:)
> result:= strtofloat(s_tmp);
еще try..except вроде ставить надо для приличия. Или не стоит?
olookin (2005-02-23 17:36:00) [30]Для полного счастья видимо так...
function str2num(s:string):real;
var i:integer; s_tmp:string;
z: string;
begin
z:='0123456789'+DecimalSeparator;
s_tmp:='';
for i:=1 to length(s) do
if Pos(z,s[i])<>0 then s_tmp:=s_tmp+s[i];
try
result:= strtofloat(s_tmp);
except НЕ_ПОМНЮ_ЧЕГО end;
//или просто использовать функцию Val
end;
olookin (2005-02-23 17:33:00) [31][16] Antonn © (23.02.05 17:27)
А я бы сделал не так...
function str2num(s:string):real;
var i:integer; s_tmp:string;
begin
s_tmp:='';
//if length вот этого я вообще не понял - это что такое?
for i:=1{элемент, т.е. символ строки начинается с 1, а не с 0} to length(s) do
if Pos('0123456789.(или ,)',s[i])<>0 then s_tmp:=s_tmp+s[i];
result:= strtofloat(s_tmp);
end;
begin...end (2005-02-23 17:31:00) [32]TryStrToInt, TryStrToFloat
Antonn (2005-02-23 17:30:00) [33]Antonn © (23.02.05 17:29) [18]
т.е. strtoint или strtofloat
Antonn (2005-02-23 17:29:00) [34]Yurij-7 (23.02.05 17:28) [17]
сделать inttostr или floattostr в блоке try..except, если прокатит, значит число:)
Yurij-7 (2005-02-23 17:28:00) [35]а неподскажите как именно это сделать или может где прочитать ну в справке ничего немогу найти :(
Antonn (2005-02-23 17:27:00) [36]
> Оставшуюся часть проверяем на соответствие числу.
самое интересное:))
Ну тогда еще учтем делимитер для полного счастья:)
function str2num(s:string):real;
var i:integer; s_tmp:string;
begin
s_tmp:='';
if length
for i:=0 to length(s) do
case ord(s[i]) of
48..57: s_tmp:=s_tmp+s[i];
44: s_tmp:=s_tmp+',';
46: s_tmp:=s_tmp+',';
end;
result:= strtofloat(s_tmp);
end;
olookin (2005-02-23 17:21:00) [37]Тогда удалем из строки все до последнего встречающегося пробела (включая его самого). Оставшуюся часть проверяем на соответствие числу. Кажется, все...
Yurij-7 (2005-02-23 17:19:00) [38]да пробел, а в конце числа точка
olookin (2005-02-23 17:11:00) [39][12] Yurij-7 (23.02.05 17:07)
А разделитель между строчной и числовой частями строки есть?
Yurij-7 (2005-02-23 17:07:00) [40]нет там только число типа количество