Ошибка is not a valid floating point value

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, unit2, unit3, unit4;
 
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    vt1: TMenuItem;
    N7: TMenuItem;
    procedure N4Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure vt1Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  a, b, n, m, i, j: integer;
  Form1: TForm1;
 
implementation
 
{ uses unit2,unit3,unit4; }
{$R *.dfm}
 
procedure TForm1.N4Click(Sender: TObject);
begin
  form2.show;
end;
 
procedure TForm1.N6Click(Sender: TObject);
begin
  close;
end;
 
procedure TForm1.N5Click(Sender: TObject);
begin
  form3.StringGrid1.rowCount := form2.StringGrid1.ColCount;
  form3.StringGrid1.ColCount := form2.StringGrid2.ColCount;
  form3.show;
end;
 
procedure TForm1.vt1Click(Sender: TObject);
var
  i, j, n, e, f, c: integer;
  z, z1, z2, fun: real;
  k: string;
begin
 
 
  form4.StringGrid1.rowCount := (form2.StringGrid1.ColCount) + 1;
  form4.StringGrid1.ColCount := (form2.StringGrid2.ColCount) + 1;
  for I := 0 to form4.StringGrid1.rowCount - 1 do
    for j := 0 to  form4.StringGrid1.ColCount - 1 do
      form4.StringGrid1.Cells [i,j]:='';
 
  { Подпись фикс. ячеек }
  n := form2.StringGrid2.ColCount;
  for j := 1 to n do
    begin
      k := inttostr(j);
      form4.StringGrid1.cells[j, 0] := 'b[' + k + ']';
    end;
  m := form2.StringGrid1.ColCount;
  for i := 1 to m do
    begin
      k := inttostr(i);
      form4.StringGrid1.cells[0, i] := 'a[' + k + ']';
    end;
  { Заполнение распределительной таблицы }
  e := 1;
  f := 1;
  c := 0;
//  z := 0;
  i := 0;
  j := 0;
  repeat
    z1 := strtofloat(form2.StringGrid1.cells[i, 0]);
    z2 := strtofloat(form2.StringGrid2.cells[j, 0]);
    if z1 < z2 then
      begin
        form4.StringGrid1.cells[f, e] := floattostr(z1);
        form2.StringGrid1.cells[i, 0] := '0';
        z := (z2 - z1);
        form2.StringGrid2.cells[j, 0] := floattostr(z);
        fun := fun + z1 * strtofloat(form3.StringGrid1.cells[f - 1, e - 1]); { Целевая функция }
        i := i + 1;
        e := e + 1;
        c := c + 1;
      end
    else
      begin
        form4.StringGrid1.cells[f, e] := floattostr(z2);
        form2.StringGrid2.cells[j, 0] := '0';
        z := (z1 - z2);
        form2.StringGrid1.cells[i, 0] := floattostr(z);
        fun := fun + z2 * strtofloat(form3.StringGrid1.cells[f - 1, e - 1]); { Целевая функция }
        j := j + 1;
        f := f + 1;
        c := c + 1;
      end;
  until n + m - 1 = c;
 
  { Целевая функция }
  form4.label2.caption := floattostr(fun);
 
  form4.show;
 
end;
 
procedure TForm1.N7Click(Sender: TObject);
var
 // a: array [1 .. 10, 1 .. 10] of real;
  n, m, i, j,  i0, j0: integer;
  min, fun, z1, z2, z: real;
  k: string;
  x, y: set of byte;
begin
  form4.StringGrid1.rowCount := (form2.StringGrid1.ColCount) + 1;
  form4.StringGrid1.ColCount := (form2.StringGrid2.ColCount) + 1;
 
  for I := 0 to form4.StringGrid1.rowCount - 1 do
    for j := 0 to  form4.StringGrid1.ColCount - 1 do
      form4.StringGrid1.Cells [i,j]:='';
  { Подпись фикс. ячеек }
 
  n := form2.StringGrid2.ColCount;
 
  for j := 1 to n do
    begin
      k := inttostr(j);
      form4.StringGrid1.cells[j, 0] := 'b[' + k + ']';
    end;
 
  m := form2.StringGrid1.ColCount;
 
  for i := 1 to m do
    begin
      k := inttostr(i);
      form4.StringGrid1.cells[0, i] := 'a[' + k + ']';
    end;
 
  fun := 0;
 
  repeat
     min := MaxInt;  // изначально ставим максимальное число
    for i := 0 to m - 1 do
      begin { нахождение min }
        if i in x then
          Continue;
        for j := 0 to n - 1 do
          begin
            if j in y then
              Continue;
            if (strtofloat(form3.StringGrid1.cells[j, i]) < min) then
              begin
                min := strtofloat(form3.StringGrid1.cells[j, i]);
                i0 := i;
                j0 := j;
              end;
          end;
      end;
 
    z1 := strtofloat(form2.StringGrid1.cells[i0, 0]);
    z2 := strtofloat(form2.StringGrid2.cells[j0, 0]);
    if (z1 > 0) AND (z2 > 0) then
      begin
        if z1 < z2 then
          begin
            form4.StringGrid1.cells[j0 + 1, i0 + 1] := floattostr(z1);
            form2.StringGrid1.cells[i0, 0] := '0';      // можешь это отключить - не надо
            z := (z2 - z1);
            form2.StringGrid2.cells[j0, 0] := floattostr(z);
            fun := fun + z1 * strtofloat(form3.StringGrid1.cells[j0, i0]); { Целевая функция }
            include(x, i0);   // исключаем строку  при последующем поиске минимального значения
            end;
 
      if z1 > z2 then
          begin
            form4.StringGrid1.cells[j0 + 1, i0 + 1] := floattostr(z2);
            form2.StringGrid2.cells[j0, 0] := '0';           // можешь это отключить - не надо
            z := (z1 - z2);
            form2.StringGrid1.cells[i0, 0] := floattostr(z);
            fun := fun + z2 * strtofloat(form3.StringGrid1.cells[j0, i0]); { Целевая функция }
            include(y, j0);   // исключаем столбец  при последующем поиске минимального значения
            end;
 
      if z1 = z2 then
          begin
            form4.StringGrid1.cells[j0 + 1, i0 + 1] := floattostr(z2); // или z1 - по выбору
            form2.StringGrid2.cells[j0, 0] := '0';              // можешь это отключить - не надо
            z := (z1 - z2);
            form2.StringGrid1.cells[i0, 0] := floattostr(z);
            fun := fun + z2 * strtofloat(form3.StringGrid1.cells[j0, i0]); { Целевая функция }
            include(x, i0);  // исключаем строку  при последующем поиске минимального значения И
            include(y, j0);  // исключаем столбец  при последующем поиске минимального значения
           end;
 
       end
   until    min = MaxInt ;
  { Целевая функция }
  form4.label2.caption := floattostr(fun);
 form4.show;
 
end;
 
end.
  Price:=StrToFloat(Sqls.TSQLs.Create.Get('SELECT Cost FROM TblRoom WHERE 
  RoomType="' + Room + '" AND HotelName = ' + QuotedStr(Hotel),'Cost'));

The Sqls.TSQLs.Create.Get is a function I created to extract a value from the data base.NOTE its in a unit

function TSQLs.Get(SQL: string; value: string): string;
begin
with Databasehub.DataModule1 do
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SQL);
ADOQuery1.Open;
if (ADOQuery1.RecordCount = 1) then
begin
Result := ADOQuery1.FieldByName(value).AsString;
end;
end;
end;

asked Apr 10, 2020 at 13:28

Umsugi's user avatar

UmsugiUmsugi

531 silver badge7 bronze badges

5

Developer should check if the value can be used to calculate price:

tmpStr := Sqls.TSQLs.Create.Get('SELECT Cost FROM TblRoom WHERE RoomType="' + Room + '" AND HotelName = ' + QuotedStr(Hotel),'Cost');
if not TryStrToFloat(tmpStr, Price) then
  Begin
    ShowMessage('be sure that the value exists, window will be closed!');
    Exit;
  End;

Also use sql parameters instead of inserting variables into string.

Andreas Rejbrand's user avatar

answered Apr 10, 2020 at 13:57

sddk's user avatar

sddksddk

1,1151 gold badge10 silver badges20 bronze badges

5

Cost is probably a null value or empty string in the database. If you are using ADO then the DB is probably Sql Server. Use StrToFloatDef to identify these:

Price:= StrToFloatDef(Sqls.TSQLs.Create.Get('SELECT Cost FROM TblRoom WHERE 
RoomType="' + Room + '" AND HotelName = ' + QuotedStr(Hotel),'Cost'), 1000000.00);

Any time it can’t do the conversion it will display 1000000.00, making it obvious that there is an issue — unless hotels really are a million a night.

answered Apr 10, 2020 at 13:50

Tav's user avatar

TavTav

3361 silver badge6 bronze badges

1

When monitoring specific OIDs with a custom SNMP sensor, the sensor shows the error message that »x’ is not a valid floating point’. What does this mean and what can I do about it?

comma
float
oid
prtg
snmp-custom-sensor

Disclaimer: The information in the Paessler Knowledge Base comes without warranty of any kind. Use at your own risk. Before applying any instructions please exercise proper system administrator housekeeping. You must make sure that a proper backup of all your data is available.

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Конвертация строки в числовой

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    19.11.16, 09:49

      Добрый день!

      Не могу найти способ конвертировать string в тип double. StrToFloat — не подходит, потому что мне нужно конвертировать с разделителем точка.

      Например

      ExpandedWrap disabled

        var

         s: string;

         d: double;

        begin

         s := 12.12345

         d := FloatToStr(s);

      выдает ошибку «is not a valid floating point value».

      Небольшое примечание, программа пишется под Android. Заранее большое спасибо!

      Сообщение отредактировано: BackUp — 19.11.16, 09:51


      MBo



      Сообщ.
      #2

      ,
      19.11.16, 10:09


        BackUp



        Сообщ.
        #3

        ,
        19.11.16, 10:25

          Возможно вы имели ввиду этот код…

          ExpandedWrap disabled

            procedure TForm1.Button1Click(Sender: TObject);

            var

              newVal: Double;

              CurFamily: TConvFamily;

              FromType, ToType: TConvType;

            begin

              DescriptionToConvFamily(ComboBox1.Items[ComboBox1.ItemIndex], CurFamily);

              DescriptionToConvType(CurFamily, ListBox1.Items[ListBox1.ItemIndex], FromType);

              DescriptionToConvType(CurFamily, ListBox2.Items[ListBox2.ItemIndex], ToType);

              newVal := Convert(StrToFloat(Edit1.Text), FromType, ToType);

              ShowMessage(Format(‘%g %s’, [newVal, ConvTypeToDescription(ToType)]));

            end;

          Но, у меня среда разработки Delphi 10. Он выдает мне новые ошибки((


          MBo



          Сообщ.
          #4

          ,
          19.11.16, 13:46

            Второй вариант функции позволяет использовать набор установок, включающий нужный разделитель

            ExpandedWrap disabled

              function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;


            BackUp



            Сообщ.
            #5

            ,
            19.11.16, 15:02

              Не совсем понятно, какой второй вариант?

              ExpandedWrap disabled

                var

                  s : string;

                  d : Double;

                begin

                  s := ‘22,767’; // У меня в системе разделитель — точка

                  FormatSettings.DateSeparator:= ‘.’;

                  d:= StrToFloat(s);

              Попробовал, никаких изменений((


              MBo



              Сообщ.
              #6

              ,
              19.11.16, 15:42

                Читаем справку вслух с выражением. По первЫх строках ея видим две перегруженные функции.

                ExpandedWrap disabled

                  function StrToFloat(const S: string): Extended; overload;

                  function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;

                Вторая из них имеет дополнительный параметр. Значит, чтобы использовать именно её, нужно вызывать со вторым параметром

                Если разделитель в строке запятая, то его и нужно указывать. Т.е. назначить DecimalSeparator, о чём тоже в справке есть. При чём тут DateSeparator?

                ExpandedWrap disabled

                  var

                    s : string;

                    d : Double;

                    fs: TFormatSettings;

                  begin

                    s := ‘22,767’;

                    fs.DecimalSeparator := ‘,’;

                    d:= StrToFloat(s, fs);

                Сообщение отредактировано: MBo — 19.11.16, 15:44


                BackUp



                Сообщ.
                #7

                ,
                19.11.16, 16:28

                  MBo спасибо за подробный пример, но наверное я не правильно смог объяснить что именно мне нужно. Есть переменная s типа string = ‘22,767’, есть массив типа R: array [1..4]of Double. Мне надо записать эти данные в массив в виде 22.767, т.е. не с «запятой», а через точку!

                  ExpandedWrap disabled

                    var

                      s : string;

                      d : Double;

                      fs: TFormatSettings;

                    begin

                      s := ‘22.767’;

                      fs.DecimalSeparator := ‘.’;

                      d:= StrToFloat(s, fs);

                      s := ‘22,767’;

                      fs.DecimalSeparator := ‘,’;

                      d:= StrToFloat(s, fs);

                  т.е. при любом раскладе d = 27,767 а мне надо что бы d было равно 27.767

                  Сообщение отредактировано: BackUp — 19.11.16, 16:43


                  Славян



                  Сообщ.
                  #8

                  ,
                  19.11.16, 17:17

                    :D Тут мало кто справится. Хотя… :popcorn:

                    <можно поставить на автоудаление>


                    MBo



                    Сообщ.
                    #9

                    ,
                    19.11.16, 17:42

                      Вот сделаешь, как у меня в примере

                      ExpandedWrap disabled

                        R[1] :=  StrToFloat(s, fs);

                      и всё будет как положено. Отличай числа и их строковое представление.


                      BackUp



                      Сообщ.
                      #10

                      ,
                      19.11.16, 18:32

                        то ли лыжи не едут…

                        MBo, ты сам пробовал свой пример? Мне нужна ТОЧКА, а там запятая! :wall:


                        Cfon



                        Сообщ.
                        #11

                        ,
                        20.11.16, 01:20

                          ТС жжот :D


                          leo



                          Сообщ.
                          #12

                          ,
                          20.11.16, 05:56

                            Цитата BackUp @ 19.11.16, 16:28

                            т.е. при любом раскладе d = 27,767 а мне надо что бы d было равно 27.767

                            Это одно и то же число в разном строковом представлении. Число d:double хранится не в строковом виде, а в особом двоичном формате, поэтому ему по барабану какой там у тебя DecimalSeparator. А точка или запятая появляются тогда, когда это число преобразуется в строку. Если на твоем компе используется DecimalSeparator = ‘,’, то соотв-но и все функции преобразования числа в строку по умолчанию будут выдавать значения с разделителем «запятая». Если тебе не нравится это (дурное бухгалтерское) представление, то на своем компе ты можешь поменять разделитель на «точку» через «Панель управления» «Региональные стандарты». Если же ты хочешь, чтобы в твоей программе вещественные числа выводились с точкой, независимо от установленного на компе значения DecimalSeparator, то для этого нужно использовать либо расширенные функции преобразования числа в строку с FormatSettings, либо старую добрую паскалевскую процедуру Str, которая всегда выдает строковое представление числа с точкой независимо от DecimalSeparator.


                            BackUp



                            Сообщ.
                            #13

                            ,
                            20.11.16, 11:10

                              Прошу прощения)))

                              Пример MBo рабочий. Благодаря объяснениям leo, я вышел из тупика… в коде был мой косяк из-за него программа выбивала ошибку.

                              Спасибо всем за участие, очень помогли

                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                              0 пользователей:

                              • Предыдущая тема
                              • Delphi: Общие вопросы
                              • Следующая тема

                              Рейтинг@Mail.ru

                              [ Script execution time: 0,0690 ]   [ 16 queries used ]   [ Generated: 5.06.23, 16:31 GMT ]  

                              Понравилась статья? Поделить с друзьями:
                            • Ошибка is an invalid float
                            • Ошибка irql not less or equal как исправить
                            • Ошибка irql not less or equal windows 11
                            • Ошибка irp фильтра unknown irp
                            • Ошибка irlq not less or equal