![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StrToFloat()
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;