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

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

StrToFloat()


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

a101081 ©   (2011-11-12 15:47:00) 

Здорово всем! У меня вопрос такого плана. Никогда с этим не сталкивался и не могу понять где хоть искать. Вот в чем проблема! У меня есть функция преобразования строки в десятичное число, выглядит она следующим образом:

function StrToFloat2(const S: string):real;
var
i:integer;
begin
if s='' then begin
Result:=-1;
exit;
end;
for I :=1  to  Length(S) do
 begin
 if not (S[I] in ['0'..'9',',']) then begin
 Result:=-1;
 exit;
 end;
end;
 Result:=StrToFloat(s);
end;

Все работает (10 компов), но вот на 3-х компьютерах все ровно выдает ошибку плана:

'3,70' is not a valid floating point value.

То есть я уже перевожу строковый формат с запятой...
Вот не могу понять... в чем может быть проблема??? 3,70 - это же типичный REAL... Пробовал менять на точку как разделитель. но тоже самое...
Помогите! Очень надо!!!

Везде системы одинаковые XP (установлены может быть и с разных установочных дисков), но системы Windows XP везде...
Может быть какой библиотеки не хватает???


Inovet   (2011-11-17 15:11:00) [1]

> [35] OW ©   (17.11.11 11:44)
> > достаточно указать нужную в параметре (см выше)
>
> где именно?

> [15] Inovet ©   (12.11.11 16:27)
> Если это чтение из файла некоторого оговорённого формата,
> где разделитель всегда ",", . Пользуйся этой функцией:
> function StrToFloat(const S: string; const AFormatSettings:
> TFormatSettings): Extended;


Inovet   (2011-11-17 15:09:00) [2]

> [35] OW ©   (17.11.11 11:44)
> где каждая выгружает в своем формате даты/времени

Значит это третий случай

> [34] Inovet ©   (17.11.11 11:22)
> Если фиг знает что там может быть, то ССЗБ.


Dennis I. Komarov   (2011-11-17 15:00:00) [3]


> это уже бабло, а не флоат

Конечно не флоат, это строка :)
StrToFloat2('1,000,000.0099') так лучше? :)


KilkennyCat   (2011-11-17 14:53:00) [4]


> Anatoly Podgoretsky ©   (17.11.11 14:37) [42]

да, и деньги тоже очень редко...


Anatoly Podgoretsky   (2011-11-17 14:37:00) [5]

> KilkennyCat  (17.11.2011 14:33:41)  [41]

Float такой крупный не быват :-)


KilkennyCat   (2011-11-17 14:33:00) [6]


> Dennis I. Komarov ©   (17.11.11 10:48) [31]
>
>
> StrToFloat2('1,000,000.01')

это уже бабло, а не флоат
а для бабла есть currency

function CurrToStrF ( Value : Currency; Format : TFloatFormat; Digits : Integer ) : string;
function CurrToStrF ( Value : Currency; Format : TFloatFormat; Digits : Integer; const FormatSettings : TFormatSettings ) : string;


OW   (2011-11-17 12:34:00) [7]

забыл про вторую форму настолько, что совсем :)


Anatoly Podgoretsky   (2011-11-17 12:16:00) [8]

> OW  (17.11.2011 11:52:37)  [37]

Ну во первых даже и в этом случае формат известен и вторая форма StrToFloat
с ним справится


Dennis I. Komarov   (2011-11-17 11:58:00) [9]


> где именно?

function StrToFloat ( FloatString : string ) : Extended;
function StrToFloat ( FloatString : string; const FormatSettings : TFormatSettings ) : Extended;


OW   (2011-11-17 11:52:00) [10]


> Anatoly Podgoretsky ©   (17.11.11 11:46) [36]

согласен вообще то..
это в идеале так должно быть

но а если обяжут использовать что-то собранное на скорую руку кем-то неподумавшим - придется пилить загрузки под . , : -


Anatoly Podgoretsky   (2011-11-17 11:46:00) [11]


> OW ©   (17.11.11 11:44) [35]

Неправильно сделаная программа.
В этим случаях используют системно-независимый формат


OW   (2011-11-17 11:44:00) [12]


> Inovet ©   (17.11.11 11:22) [34]

не понял
вот типичный случай - читать файлы выгрузки с разных машин
где каждая выгружает в своем формате даты/времени
и как?

> достаточно указать нужную в параметре (см выше)

где именно?


Inovet   (2011-11-17 11:22:00) [13]

> [30] OW ©   (17.11.11 10:26)

Если формат ввода чётко определён, то и менять ничего не надо, достаточно указать нужную в параметре (см выше). Если вводится вручную - использовать установки локали, они и так по умолчанию используются. Если фиг знает что там может быть, то ССЗБ.


OW   (2011-11-17 11:16:00) [14]


> Dennis I. Komarov ©   (17.11.11 10:48) [31]
>
>


>  //ошибка конверта


Dennis I. Komarov   (2011-11-17 10:52:00) [15]


> avel   (14.11.11 13:54) [27]
>
> если тебе надо поставить "точный" разделитель, а не определенной
> средой, то поменяй значение переменной модуля SysUtils DecimalSeparator.
>

И получить "is not a valid floating point value." где-нить еще...


Dennis I. Komarov   (2011-11-17 10:48:00) [16]


> OW ©   (17.11.11 10:26) [30]

StrToFloat2('1,000,000.01')
И чего? :)))


OW   (2011-11-17 10:26:00) [17]

function StrToFloat2(const S: string):double;
var
  ec: Integer;
  val: Double;
begin
  if s='' then
  begin
    Result := -1;  // пусто   в
    exit;
  end;
  s := StringReplace(S,'.', DecimalSeparator, [frAllReplace]); //заменить возможный разделитель реальным
  s := StringReplace(S,',', DecimalSeparator, [frAllReplace]);
  s := StringReplace(S,'-', DecimalSeparator, [frAllReplace]); //Завтра найдется еще один такой умник с "-" разделителем и всем поменяет...
  TryStrToFloat(S, Val, ec);
  if ec <> 0 then
  begin
    Result := -10; //ошибка конверта
    exit;
  end;
  Result := Val;
end;


Anatoly Podgoretsky   (2011-11-17 09:57:00) [18]


> то поменяй значение переменной модуля SysUtils DecimalSeparator.

Зачем? Чтобы нарушить работу? Стоит ознакомиться по справке, что такое StrToFloat, и уже потом давать дикие советы.


Dennis I. Komarov   (2011-11-17 01:11:00) [19]


> то поменяй значение переменной модуля SysUtils DecimalSeparator

Но не забудь при этом сразу вернуть его обратно, ибо это выбор пользователя и он так желает видить этот разделитель :Р


avel   (2011-11-14 13:54:00) [20]

если тебе надо поставить "точный" разделитель, а не определенной средой, то поменяй значение переменной модуля SysUtils DecimalSeparator. "Все ли нормально" обычно проверяют через try except end;


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

Наверх

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