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

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

копирование нестандартной длины строки [D6, Win95/98, WinXP]


Страницы:   1 2 3

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]

нет там только число типа количество


Страницы:   1 2 3

Наверх

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