Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198

Выделить подстроку, которая соответствует записи вещественного числа

23.09.2009, 15:12. Показов 7436. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой? Мне думается так: считывать строку и если находится в ней одна запятая, то эта та строка, которая мне и нужна, но вот как узнать число ли это?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2009, 15:12
Ответы с готовыми решениями:

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и «–». Выделить подстроку, которая соответствует записи...

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи...

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков "+" и "-". Выделить подстроку, которая соответствует записи...

29
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
23.09.2009, 15:45
А в строке только одна запятая, или точка? Приведи пример строк.

Добавлено через 14 минут
Как узнать, что это число (в примере вещественное).
Если может быть ноль, то поставить такой параметр, которого точно не будет. Можно например написать 0.0001, даже если оно попадется, то при преобразовании все равно не совпадет с точным значением и будет прочитано как число.
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
    a:real;
begin
s:=Edit1.Text;
a:=StrToFloatDef(s,0);
if a<>0 then Edit2.Text:=FloatToStr(a)
else ShowMessage('Это не число!');
end;
0
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
23.09.2009, 19:47  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
А в строке только одна запятая, или точка? Приведи пример строк.

Добавлено через 14 минут
Как узнать, что это число (в примере вещественное).
Если может быть ноль, то поставить такой параметр, которого точно не будет. Можно например написать 0.0001, даже если оно попадется, то при преобразовании все равно не совпадет с точным значением и будет прочитано как число.
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
    a:real;
begin
s:=Edit1.Text;
a:=StrToFloatDef(s,0);
if a<>0 then Edit2.Text:=FloatToStr(a)
else ShowMessage('Это не число!');
end;
Да нет, получается тогда что дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Но ведь всё равно же эта процедура будет работать, так как она сможет распознать только число в правильно записанной форме, а на всё остальное будет ошибка.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
23.09.2009, 19:56
Так что нужно-то? Взяли манеру полуфразами писать, попробуй догадайся, что тебе надо. Всё секреты своих супер-программ боитесь раскрыть? Тогда не стоит и спрашивать.
0
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
23.09.2009, 20:17  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
Так что нужно-то? Взяли манеру полуфразами писать, попробуй догадайся, что тебе надо. Всё секреты своих супер-программ боитесь раскрыть? Тогда не стоит и спрашивать.
Хех, нет Мне нужно в TComboBox вводить строки, состоящие из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
23.09.2009, 20:29
1.Ищи в строке разделитель вещественного числа(точка или запятая).
2.Если перед ним и после него цифра, иди назад по строке пока будут цифры, если цифры кончились и следующий перед ними знак + или -, берем его.
3.Переворачиваем получившуюся строку, это целая часть числа.
4. Тоже вперед от знака, только без + и -, это дробная часть числа.
5. Соединяем через разделитель, получаем число.
Это как вариант, можно и по другому.
1
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
24.09.2009, 21:44  [ТС]
Хех, что-то я совсем тупой У меня что-то даже этот кусок не работает:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
for i:=1 to Length(st) do
    begin
      if ((st[i]=',') or (st[i]='.')) then
        begin
          if ((st[i-1]='0..9') or (st[i-1]='-') or (st[i-1]='+')) and ((st[i+1]='0..9') or (st[i+1]='-') or (st[i+1]='+')) then
            begin
              PoleVivoda.Lines.Add(st);
              PoleVivoda.Lines.Add('Yes');
            end;
        end
      else PoleVivoda.Lines.Add('No');
    end;
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
24.09.2009, 21:57
Во-первых нужно использовать внешний цикл while.
i:=1;
while i<=length(s) do
begin
ищем запятую, if s[i]=',' then
нашли, запоминаем индекс , смотрим что стоит слева, если цифра(не знак - или +), то
идем влево, опять в цикле while
пока идут цифры, составляем слово, кончились цифры, смотрим что следующее, если знак, добавляем его, все. Переворачиваем строку. Потом от индекса, если за ним цифра, также собираем дробную часть, не переворачиваем, закончили, перепрыгиваем через дробную часть(если она есть), ищем следующее число.
Ты нарисуй такую строку на бумаге и тренируйся, я же не могу тебе мысленно все передать, тут думать надо, пробовать.
0
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
25.09.2009, 15:43  [ТС]
Хех, я тупой Вот что я теперь намучал:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while i<=Length(st) do
    begin
      if ((st[i]=',') or (st[i]='.')) then
        begin
            a:=i;
            for j:=a downto 1 do
              begin
                if (st[j]='0..9') then
                  begin
                    for k:=a to Length(st) do
                      begin
                        if (st[i]='0..9') then Showmessage('OK!');
                      end;
                  end;
               end;
        end;
    end;
Но ничего не работает опять( Здесь я конечно по несколько другому более тупому адгоритму делал (без знаков), но всё равно не работает. Где ошибка?
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.09.2009, 17:38
Еще раз внимательно прочитай мой последний пост и ничего не придумывай. Сразу нашел 2 нарушения.
1. Не проверил, стоит ли слева от разделителя цифра.
2.Нафига заменил while на for?
Ведь если while, то смотрит пока цифры, а for все цифры, даже если между ними не цифры. Кроче мозг включи, иначе до пенсии это решать будешь, или копи деньги и во Фриланс.
0
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
25.09.2009, 21:23  [ТС]
У меня зацикливается на этом месте:
Delphi
1
2
3
while i<=Length(st) do
    begin
      if ((st[i]=',') or (st[i]='.')) then
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.09.2009, 21:39
Очень содержательный код. На этом как раз не зациклится.
Подозреваю что в конце цикла перед end; нет типа i:=i+1;
А после выделения числа, указатель на индекс не перемещается на нужное место, а именно на следующий символ после числа. Это можно определить как индекс разделителя + длина дробной части.

Добавлено через 7 минут
Вот посмотри организацию циклов при поиске в строке, где и как начинаются циклы, кончаются. Это из рабочей программы.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
readln(s);
i:=1;f:=0;{начинаем с первого символа, слов с буквой к пока нет}
while i<=length(s) do{пока не конец строки}
 begin
  if s[i] in bk then{если попалась буква}
   begin
    s1:='';{начинаем собирать слово}
    j:=i;
    while s[j] in bk do{пока идут подряд буквы}
     begin
      s1:=s1+s[j];{добавляем их в слово}
      j:=j+1;
     end;
    k:=0;{ищем букву к в слове}
    for l:=1 to length(s1) do
    if s1[l]='k' then{нашли}
     begin
      k:=1;{есть такая}
      break;{больше не надо}
     end;
    if k=1 then{если есть}
     begin
      f:=1;{есть такое слово}
      write(s1,' ');{выводим его}
     end;
    i:=i+length(s1);{перепрыгиваем через него}
   end
  else i:=i+1;{если не буква, идем дальше}
 end;
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
25.09.2009, 21:46
Цитата Сообщение от Lil Crazy Посмотреть сообщение
... Вот что я теперь намучал: ... Но ничего не работает опять(
От себя добавлю:
Delphi
1
2
3
4
5
//Конечно такое будет работать вовсе не так как ты задумал:
if (st[j]='0..9') then ...
 
//Правильно вот так:
if (st[j] in ['0'..'9']) then ...
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.09.2009, 22:54
И вообще все множества, которые есть в программе чтоб не путаться так объявляй константами например
Delphi
1
2
3
4
const
cf=['0'..'9'];
zn=['.',','];
тогда в программе просто if s[i] in cf then .....
Добавлено через 1 час 2 минуты
Вот я написал пример поиска вещественных чисел в строке. Писал в Паскале, закинь в консоль, посмотри. Менять ничего не надо.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const cf=['0'..'9'];
      zn=['.',','];
var s,s1,s2,s3:string;
    i,j,l:integer;
    c:char;
begin
s:='hjj-888.235kli256.32kjii-256,256;lkoo';
writeln(s);
writeln;
i:=1;
while i<=length(s) do
if (s[i] in zn)and(s[i-1] in cf)and(s[i+1] in cf)  then{разделитель между цифрами}
 begin
   s1:='';
   j:=i-1;{начинаем с цифры перед разделителем}
   while s[j] in cf do{пока цифры}
     begin
       s1:=s1+s[j];{собираем целую часть числа с конца}
       j:=j-1;{идем назад}
     end;
   if s[i-length(s1)-1]='-' then s1:=s1+'-';{если после цифр минус, добавляем}
   for l:=1 to length(s1)div 2 do{переворачиваем число}
     begin
      c:=s1[l];
      s1[l]:=s1[length(s1)-l+1];
      s1[length(s1)-l+1]:=c;
     end;
   s2:='';
   j:=i+1;
   while s[j] in cf do{собпраем дробную часть}
      begin
         s2:=s2+s[j];
         j:=j+1;{идем вперед}
      end;
   i:=i+length(s2);{перепрыгиваем через нее}
   s3:=s1+'.'+s2;
   writeln(s3);
 end
else i:=i+1;
readln
end.
0
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
25.09.2009, 22:57  [ТС]
Вот очередной вариант моего тупого кода:
Delphi
1
2
3
4
const
  Numeric=['0'..'9'];
  Mark=[',','.'];
  Symbol=['-','+'];
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
procedure TGlavnayaForma.KnopkoPodshetClick(Sender: TObject);
var
  st:string;
  n,i,nst,j,k:integer;
  a,p,p1:Integer;
  float:Extended;
  errorPos:Integer;
begin
  nst:=PoleVvodaIVivoda.ItemIndex;
  st:=PoleVvodaIVivoda.Items[nst];
  i:=1;
  a:=0;
  p:=pos('-',st);
  p1:=Pos('+',st);
  if (p=1) or (p1=1) or (st[1] in Numeric) then
  begin
  while i<=Length(st) do
    begin
      if st[i] in Mark then //если есть точка или запятая
        begin
          a:=i;
          if (st[a-1] in Numeric) and (st[1+1] in Numeric) then //если до запятой и после неё число
            begin
              while st[a+1] in Numeric do
                begin
                  for j:=a-1 downto 1 do //иду влево (не знаю как в while сделать)
                    begin
                      if st[j] in Numeric then
                        continue
                      else
                        break;  
                    end;
                  a:=a+1;
                end;
              ShowMessage('OK');  
            end
          else
            begin
              ShowMessage('NO!'); //если нет знаков
              Exit;
            end;
        end
      else
        begin
          ShowMessage('NO!');
          Exit;
        end;
      i:=i+1; 
    end;
    end
    else
      ShowMessage('No');
    {a:=StrToFloat(st);
    if a<>0 then PoleVvodaIVivoda.Items.Add(FloatToStr(a))
      else ShowMessage('Это не число!');}
end;
Что как-то не удаётся мне... Это первый мой раз работы со строками Пока что работает так:
Delphi
1
2
3
4
5
nst:=PoleVvodaIVivoda.ItemIndex;
  st:=PoleVvodaIVivoda.Items[nst];
  a:=StrToFloat(st);
  if a<>0 then PoleVvodaIVivoda.Items.Add(FloatToStr(a))
    else ShowMessage('Это не число!');
,
но это не строками работа.

Добавлено через 59 секунд
Так, хорошо, сейчас буду разбираться!
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
25.09.2009, 22:58
Кстати знак + наверное не надо, я не помню, функции Делфи воспринимают числа типа +12 как число. Вроде нет.
1
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
25.09.2009, 23:05  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
Кстати знак + наверное не надо, я не помню, функции Делфи воспринимают числа типа +12 как число. Вроде нет.
Воспринимают
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
25.09.2009, 23:20
Я чувствую, что проблема в том, что человек измучился уже "ползать" по вложенным циклам и ломать голову "что где и откуда шагается и до каких пор". Предлагаю, как бы, изменить подход в кодировании. Разбить алгоритм на шаги и соответственно оформить код.
Вот написал работающий вариант (на Delphi 7):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit uMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TfrmMain = class(TForm)
    edStrSrc: TEdit;
    Label1: TLabel;
    btnFind: TButton;
    edStrRes: TEdit;
    Label2: TLabel;
    procedure btnFindClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  frmMain: TfrmMain;
 
implementation
 
uses StrUtils;
 
{$R *.dfm}
 
function FindFloatNum(aStrSrc : String; var aStrRes : String) : Boolean;
var
  //Позиция на которой находится запятая.
  PosPnt : Integer;
  //Позиция на которой находится первая цифра искомого числа.
  Pos1 : Integer;
  //Позиция на котой расположена последняя цифра искомого числа.
  Pos2 : Integer;
 
  StrInt : String;
  StrFrac : String;
begin
 
  aStrRes := '';
 
  //Ищем дясятичную точку - это знак запятая: ','
  PosPnt := Pos(',', aStrSrc);
 
  //Если не нашли.
  if PosPnt = 0 then Result := False;
 
  //Если нашли.
 
  //Определяем есть ли целая часть.
  //Для этого "шагаем" влево от запятой. И шагаем до тех пор, пока не встретим
  //первую "не цифру", либо пока не дойдём до начала строки.
 
  Pos1 := PosPnt; //Это позиция на которой находится запятая.
 
  while Pos1 > 1 do begin //Т. е. перед очередным шагом слева должен быть хотябы один символ.
    //Шаг влево.
    Pos1 := Pos1 - 1;
    if not (aStrSrc[Pos1] in ['0'..'9']) then begin
      //Раз нашли не цифру, то возвращаемся на шаг правее.
      Pos1 := Pos1 + 1;
      //И выходим из цикла.
      Break;
    end;
  end;
 
  //Еcли цифры левее запятой не нашлись, то полагаем, что число не найдено.
  if Pos1 = PosPnt then begin
    Result := False;
    Exit;
  end;
 
  //Раз цифры левее запятой обнаружились, то они принадлежат целой части.
  //При этом номер позиции, на которой расположена первая цифра искомого числа, равна Pos1.
 
  //Теперь определяем есть ли дробная часть.
  //Начинаем шагать вправо от запятой. Шагаем до тех пор, пока не встретим
  //первую "не цифру", либо пока не дойдем до конца строки.
 
  Pos2 := PosPnt; //Это позиция на которой находится запятая.
 
  while Pos2 < Length(aStrSrc) do begin //Т. е. перед очередным шагом справа должен быть хотябы один символ.
    //Шаг вправо.
    Pos2 := Pos2 + 1;
    if not (aStrSrc[Pos2] in ['0'..'9']) then begin
      //Раз нашли не цифру, то возвращаемся на шаг левее.
      Pos2 := Pos2 - 1;
      //И выходим из цикла.
      Break;
    end;
  end;
 
  //Еcли цифры правее запятой не нашлись, то полагаем, что число не найдено.
  if Pos2 = PosPnt then begin
    Result := False;
    Exit;
  end;
 
  //Раз цифры правее запятой обнаружены, то они принадлежат дробной части.
  //При этом номер позиции, на которой расположена последняя цифра искомого числа, равна Pos2.
 
  //Теперь выделяем обнаруженное число.
 
  aStrRes := Copy(aStrSrc, Pos1, Pos2 - Pos1 + 1);
  Result := True;
 
end;
 
procedure TfrmMain.btnFindClick(Sender: TObject);
var
  StrRes : String;
begin
  edStrRes.Text := 'Не обнаружено';
  if FindFloatNum(edStrSrc.Text, StrRes) then begin
    edStrRes.Text := StrRes;
  end;
end;
 
end.
Lil Crazy, как тебе такая реализация?
---
В функции FindFloatNum() переменные:
StrInt : String;
StrFrac : String;
не нужны. Я сначала думал записать в них целую и дробную часть. Но потом пошёл другим путем...
---
А! И я забыл прикрутить чтение знака: "+" или "-". Но это мелочи. Если надо, скажи - приделаю.
Вложения
Тип файла: rar FindFloatNum.rar (166.0 Кб, 53 просмотров)
1
 Аватар для Lil Crazy
6 / 6 / 2
Регистрация: 23.03.2009
Сообщений: 198
26.09.2009, 12:02  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Я чувствую, что проблема в том, что человек измучился уже "ползать" по вложенным циклам и ломать голову "что где и откуда шагается и до каких пор". Предлагаю, как бы, изменить подход в кодировании. Разбить алгоритм на шаги и соответственно оформить код.
Вот написал работающий вариант (на Delphi 7):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
unit uMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TfrmMain = class(TForm)
    edStrSrc: TEdit;
    Label1: TLabel;
    btnFind: TButton;
    edStrRes: TEdit;
    Label2: TLabel;
    procedure btnFindClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  frmMain: TfrmMain;
 
implementation
 
uses StrUtils;
 
{$R *.dfm}
 
function FindFloatNum(aStrSrc : String; var aStrRes : String) : Boolean;
var
  //Позиция на которой находится запятая.
  PosPnt : Integer;
  //Позиция на которой находится первая цифра искомого числа.
  Pos1 : Integer;
  //Позиция на котой расположена последняя цифра искомого числа.
  Pos2 : Integer;
 
  StrInt : String;
  StrFrac : String;
begin
 
  aStrRes := '';
 
  //Ищем дясятичную точку - это знак запятая: ','
  PosPnt := Pos(',', aStrSrc);
 
  //Если не нашли.
  if PosPnt = 0 then Result := False;
 
  //Если нашли.
 
  //Определяем есть ли целая часть.
  //Для этого "шагаем" влево от запятой. И шагаем до тех пор, пока не встретим
  //первую "не цифру", либо пока не дойдём до начала строки.
 
  Pos1 := PosPnt; //Это позиция на которой находится запятая.
 
  while Pos1 > 1 do begin //Т. е. перед очередным шагом слева должен быть хотябы один символ.
    //Шаг влево.
    Pos1 := Pos1 - 1;
    if not (aStrSrc[Pos1] in ['0'..'9']) then begin
      //Раз нашли не цифру, то возвращаемся на шаг правее.
      Pos1 := Pos1 + 1;
      //И выходим из цикла.
      Break;
    end;
  end;
 
  //Еcли цифры левее запятой не нашлись, то полагаем, что число не найдено.
  if Pos1 = PosPnt then begin
    Result := False;
    Exit;
  end;
 
  //Раз цифры левее запятой обнаружились, то они принадлежат целой части.
  //При этом номер позиции, на которой расположена первая цифра искомого числа, равна Pos1.
 
  //Теперь определяем есть ли дробная часть.
  //Начинаем шагать вправо от запятой. Шагаем до тех пор, пока не встретим
  //первую "не цифру", либо пока не дойдем до конца строки.
 
  Pos2 := PosPnt; //Это позиция на которой находится запятая.
 
  while Pos2 < Length(aStrSrc) do begin //Т. е. перед очередным шагом справа должен быть хотябы один символ.
    //Шаг вправо.
    Pos2 := Pos2 + 1;
    if not (aStrSrc[Pos2] in ['0'..'9']) then begin
      //Раз нашли не цифру, то возвращаемся на шаг левее.
      Pos2 := Pos2 - 1;
      //И выходим из цикла.
      Break;
    end;
  end;
 
  //Еcли цифры правее запятой не нашлись, то полагаем, что число не найдено.
  if Pos2 = PosPnt then begin
    Result := False;
    Exit;
  end;
 
  //Раз цифры правее запятой обнаружены, то они принадлежат дробной части.
  //При этом номер позиции, на которой расположена последняя цифра искомого числа, равна Pos2.
 
  //Теперь выделяем обнаруженное число.
 
  aStrRes := Copy(aStrSrc, Pos1, Pos2 - Pos1 + 1);
  Result := True;
 
end;
 
procedure TfrmMain.btnFindClick(Sender: TObject);
var
  StrRes : String;
begin
  edStrRes.Text := 'Не обнаружено';
  if FindFloatNum(edStrSrc.Text, StrRes) then begin
    edStrRes.Text := StrRes;
  end;
end;
 
end.
Lil Crazy, как тебе такая реализация?
---
В функции FindFloatNum() переменные:
StrInt : String;
StrFrac : String;
не нужны. Я сначала думал записать в них целую и дробную часть. Но потом пошёл другим путем...
---
А! И я забыл прикрутить чтение знака: "+" или "-". Но это мелочи. Если надо, скажи - приделаю.
Вот вам огромное спасибо, так действительно проще
А! И я забыл прикрутить чтение знака: "+" или "-". Но это мелочи. Если надо, скажи - приделаю.
Хех, ну тогда уж приделайте
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
26.09.2009, 12:27
Цитата Сообщение от Lil Crazy Посмотреть сообщение
Вот вам огромное спасибо, так действительно проще
Еще бы всю программу написал. Тебе и делать ничего не надо и думать. Я вообще-то с чего-то решил, что ты сам с алгоритмом хотел разобраться, а тебе просто халява была нужна. Жаль.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2009, 12:27
Помогаю со студенческими работами здесь

Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой
Ребята помогите написать программу для этого условия. Или подскажите как стрку посимвольно загнать в массив.

Выделить из заданной строки подстроку, которая соответствует записи вещественного числа с плавающей точкой
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков &quot;+&quot; и &quot;-&quot;. Выделить подстроку, которая соответствует записи...

Выделить подстроку, которая соответствует записи целого числа
Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т.е....

Выделить подстроку, которая соответствует записи целого числа
Дана строка, состоящая из букв, цифр, запятых, точек, знаков &quot;+&quot; и &quot;-&quot;. Выделить подстроку, которая соответствует записи целого числа (т.е....

Дана строка, состоящая из букв, цифр, запятых, точек, знаков "+" и "-". Выделить подстроку, которая соответствует записи целого числа (т.е. начинаетс
Дана строка, состоящая из букв, цифр, запятых, точек, знаков &quot;+&quot; и &quot;-&quot;. Выделить подстроку, которая соответствует записи целого числа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru