Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.104.238] |
|
Сообщ.
#1
,
|
|
|
Всем программистам привет! Respect! Встал на проблеме, которую думал, что сделаю быстро и легко. Допустим есть такая строка:
s := "12.10.1998"; как мне ее отпарсить, чтобы на выходе получить три целочисленные переменные, в одной из которых 12, во второй 10 и в третьей 1998. Желательно саму переменную s не испортить после преобразования. Стал делать, и понял что автоматизировать процесс не получается мне + кучу переменных. А на самом деле задача такая, есть некая функция, например function(f : string; s : string) : boolean; begin end; |
Сообщ.
#2
,
|
|
|
в Delphi есть функция StrToDate, но не помню, было ли подобное в Паскале.
Однако если формат более-менее жесткий,и отличается только возможным количеством позиций под число, то никаких проблем разобрать его не составляет - просто идешь по строке - встретил точку - копируешь от начала или от прошлой точки до текущей, и переводишь в число |
Сообщ.
#3
,
|
|
|
я согласен с вами, но копирование портит строку, т е теряется хвост строки.
Добавлено прошу прощения, что то я загнал, сейчас проверил на простом примере, действительно можно заюзать copy. Thank's. Незнание синтаксиса порождает огромные проблемы для меня Добавлено все равно получилось как то не программно , только для первого числа: {===========================================================} {функция сравнивает два значения между собой} function equals(first : string; second : string) : boolean; var f_d, s_d : byte; f_m, s_m : byte; f_y, s_y : word; index : byte; tmpFirst, tmpSecond : string; code : integer; i : byte; begin tmpFirst := first; tmpSecond := second; index := pos('.', tmpFirst); val(copy(tmpFirst, 1, index - 1), f_d, code); if(code = 0) then begin delete(tmpFirst, 1, index); end; index := pos('.', tmpFirst); val(copy(tmpFirst, 1, index - 1), f_m, code); if(code = 0) then begin delete(tmpFirst, 1, index); end; val(tmpFirst, f_y, code); end; {===========================================================} для второго нужно будет тоже самой, и только тогда начинать проверку на больше меньше начиная с года. Может все таки как то можно поумнее сделать? Добавлено в итоге получил вот этот ужас: {===========================================================} {функция сравнивает два значения между собой} function equals(first : string; second : string) : boolean; var f_d, s_d : byte; f_m, s_m : byte; f_y, s_y : word; index : byte; tmpFirst, tmpSecond : string; code : integer; begin tmpFirst := first; index := pos('.', tmpFirst); val(copy(tmpFirst, 1, index - 1), f_d, code); if(code = 0) then begin delete(tmpFirst, 1, index); end; index := pos('.', tmpFirst); val(copy(tmpFirst, 1, index - 1), f_m, code); if(code = 0) then begin delete(tmpFirst, 1, index); end; val(tmpFirst, f_y, code); tmpSecond := second; index := pos('.', tmpSecond); val(copy(tmpSecond, 1, index - 1), s_d, code); if(code = 0) then begin delete(tmpSecond, 1, index); end; index := pos('.', tmpSecond); val(copy(tmpSecond, 1, index - 1), s_m, code); if(code = 0) then begin delete(tmpSecond, 1, index); end; val(tmpSecond, s_y, code); {только теперь начинаем проверку} equals := false; if(f_y > s_y) then begin equals := true; end else begin if(f_y = s_y) then begin if(f_m > s_m) then begin equals := true; end else begin if(f_m = s_m) then begin if(f_d > s_d) then begin equals := true; end else begin equals := false; end; end; end; end; equals := false; end; end; {===========================================================} может быть можно как то все более правильно сделать. Подскажите как быть то? |
Сообщ.
#4
,
|
|
|
//возвращает -1, 0, 1 - вторая дата в формате день.месяц.год меньше, равна, больше первой function CompareDateStrings(first, second: string): Integer; procedure ExtractDMY(s: string; var ar: array of Word); var LastPoint, i, index: byte; code: integer; begin LastPoint := 0; index := 0; for i := 1 to Length(s) + 1 do if (i > Length(s)) or (s[i] = '.') then begin //подразумевается сокращенная оценка условий - в опциях компилятора Complete Boolean Eval - OFF Val(Copy(s, LastPoint + 1, i - LastPoint - 1), ar[index], code); Inc(index); LastPoint := i; end; end; var f_d, s_d: array[0..2] of Word; Compare: Longint; begin ExtractDMY(first, f_d); ExtractDMY(second, s_d); Compare := (s_d[2] - f_d[2]) * 512 + (s_d[1] - f_d[1]) * 32 + s_d[0] - f_d[0]; if Compare = 0 then Result := 0 else if Compare > 0 then Result := 1 else Result := -1; end; |
Сообщ.
#5
,
|
|
|
хм, круто мне тут необходимо еще будет разбираться. Спасибо большое за помощь.
|