[Delphi 7] Как строку перевести во Float, если...

kotenok1710

Если в ней записана строчка типа 1.1231223e+001
Нужно из неё получить константу типа Float или что-то с чем можно работать.
Есть ли функция какая типа StrToFloat? Собсно сам практически ничего не знаю в делфх.

yroslavasako

StrToFloat
бинго, типа. Набери в редакторе эту строчку и нажми на ней F1.

kotenok1710

Ок. Там напсано, что StrToFloat может конвертировать строку моего вида в формат float. Только при попытке это сделать, вылезает вот что:

Вот собсно процедура:
 procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(i);
tmp2:=StrToFloat(StringGrid1.Cells[1,4]);
end;

Dasar

если вместо точки поставить запятую, то работает?

kotenok1710

:D Точно! Спасибо, а то думал с ума сойду тут

zorin29

Если надо обязательно точку то надо написать нечто вроде:
var
old_ds: Char;
...
old_ds := DecimalSeparator;
DecimalSeparator := '.';
flt := StrToFloat(s);
DecimalSeparator := old_ds;
...

Этот код будет работать в любой локали, а не только в русской.

lubanj

а что если DecimalSeparator используется где-то кем-то еще? а что, если забудешь или не дадут восстановить?
 может надежнее делать так: ?
 
s := s.Replace('.',DecimalSeparator);
f := StrToFloat(s);

rosali

+1.
то есть проблема конешно не в том что "не дадут" :) а просто из StrToFloat вылетит исключение и DecimalSeparator := old_ds; просто не отработает.

Dasar

 может надежнее делать так: ?
не сработает, если числа приходят в русском формате, а в проге стоит английская локаль.

lubanj

сработает, какая бы там локаль не стояла. DecimalSeparator - имеется ввиду CurrentDecimalSeparator из текущей установленной локали

lubanj

то есть проблема конешно не в том что "не дадут" а просто из StrToFloat вылетит исключение
да. я это имел ввиду в первую очередь. тут проблема конечно решаема :), но вот еще возможный проблемный вариант:
соседний тред прерывает наш абортом.

Dasar

сработает, какая бы там локаль не стояла. DecimalSeparator - имеется ввиду CurrentDecimalSeparator из текущей установленной локали
а подумать?
CurrentDecimalSeparator - будет точка, т.к. текущая локаль - английская.
а числа вводятся с запятой (их так бухгалтер вводит, или из файла какого-то берутся).
в итоге replace заменит точку на точку, но запятую не тронет.
а StrToFloat опять же будет реагировать на точку, а не на запятую.

Dasar

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

lubanj

а если числа вводяться вообще через жопу? целая часть на одной строке, а дробная в другом файле, да еще и закодирована?!
то есть ты хочешь, чтобы прога независимо от способа ввода числе (через точку, через запятую, через знак доллара, через знак чего-нибудь еще) соображала, что ей подсунули флоат и корректно его парсила? прямо какой-то ИИ получается :)
ты запутался что-ли?
вроде бы все-таки задача стояла такая: формат вводимых чисел жестко задан (в данном случае через точку) и нужно написать прогу, которая будет те самые числа корректно парсить независимо от компа, где она запущена. (на русской или на английской или на какой-нибудь туземской локали)

Dasar

ты че такой нервный? не выспался?
тебе было подсказано, что хотя твой способ и подходит для начального вопроса, но в качестве универсального надежного решения не годится, о чем и было написано в моем посте (или ты его не читал?)
ps
кстати в исходном сообщении ничего не сказано, что формат жестко заданный (с точкой а не зависит от каких-то внешних факторов.

lubanj

ДаркГрей, ты вроде нормальные вещи в этом разделе пишешь, но сегодня, знаешь, че-то как-то не айс. долго домой с работы ехал?
давай тогда предлагай универсальное правильно работающее везде решение. особенно интересует движок ИИ.

Dasar

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

lubanj

ты так, что-ли хочешь?

s := s.Replace(',',DecimalSeparator);
s := s.Replace('.',DecimalSeparator);
f := StrToFloat(s);

Dasar

ты так, что-ли хочешь?
да
Оставить комментарий
Имя или ник:
Комментарий: