Вниз
Скачать: CL | DM;

Подобие функции StrToFloat. Помогите!   Найти похожие ветки 

← →
Василий   (2007-06-12 09:16) [0]

Здравствуйте. Помогите пожалуйста. Есть переменная типа string s, хранящая следующую запись формы числа:
s="1.588069080798e+000". Как переменной типа double a присвоить значение, которое храниться в переменной s?
Наверняка должна быть спец функция типа StrToFloat, которая не работает в моём случае.


← →
G_M_S ©   (2007-06-12 09:31) [1]

Да вроде нет такой... А в чем проблема - запись разобрать не сложно, берешь число и умножаешь на 10 в какой-то степени. В чем трабла?


← →
Юрий Зотов ©   (2007-06-12 09:56) [2]

procedure TForm1.FormCreate(Sender: TObject);
var
 d: double;
begin
 d := StrToFloat("1.588069080798e+000");
 Caption := FloatToStr(d);
end;

Все прекрасно работает. Проверьте DecimalSeparator.


← →
G_M_S ©   (2007-06-12 10:15) [3]


> Проверьте DecimalSeparator.

У него может быть слишком много цифр после разделителя - у меня в TD2006 при этом тоже эксепшен вылазит.


← →
Kolan ©   (2007-06-12 10:19) [4]

В BDS2006 все работает:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
d: double;
begin
d := StrToFloat("1,588069080798e+000");
Caption := FloatToStr(d);
end;


Имхо единственное что не так — DecimalSeparator.


← →
Юрий Зотов ©   (2007-06-12 10:27) [5]

> G_M_S ©   (12.06.07 10:15) [3]

У него в мантиссе 13 цифр. Тип double справляется с 15-16. Подозреваю, что для FloatToStr можно вобще задавать сколь угодно длинные мантиссы и экспоненты, с лишними цифрами она должна справиться сама.

procedure TForm1.FormCreate(Sender: TObject);
var
 d: double;
begin
 d := StrToFloat("1.5880690807981588069080798e+00000000000001");
 Caption := FloatToStr(d);
end;

И тоже все прекрасно работает. Число, как и следовало ожидать, округляется до 15.8806908079816


← →
Юрий Зотов ©   (2007-06-12 10:28) [6]


> для FloatToStr

Сорри, для StrToFloat, конечно.


← →
G_M_S ©   (2007-06-12 12:14) [7]


> Подозреваю, что для FloatToStr можно вобще задавать сколь
> угодно длинные мантиссы и экспоненты

Смотря что понимать под "длинными"... Вот такая строка вызывает эксепшен:

r := StrToFloat("1,576234578233245235465237535E+10000");

ЗЫ: так же пробел в любом месте вызывает эксепшен, равно как и русская "Е" :)))


← →
Юрий Зотов ©   (2007-06-12 12:42) [8]

> G_M_S ©   (12.06.07 12:14) [7]

> Смотря что понимать под "длинными"...
То же, что и всегда - количество знаков.

> Вот такая строка вызывает эксепшен...
И правильно вызывает - превышен допустимый диапазое экспоненты.

> так же пробел в любом месте вызывает эксепшен, равно как и русская "Е"
Странно, да? И с чего бы это...


← →
G_M_S ©   (2007-06-12 13:06) [9]


> И правильно вызывает - превышен допустимый диапазое экспоненты.

Ну да. А при мануальном переводе можно эту ситуацию учесть.

Кроме того, и при неправильном делимитере, и при превышении диапазона эксепшен одинаковый, а мануально можно генерить эксепшены разных типов на разные ошибки.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.017 c
1-1181667315
Max_
2007-06-12 20:55
2007.08.19
Печать


15-1184667005
pavel_guzhanov
2007-07-17 14:10
2007.08.19
Умер Михаил Кононов


2-1185124611
Надежда
2007-07-22 21:16
2007.08.19
событие закрытия формы


15-1185267975
Наташка К.
2007-07-24 13:06
2007.08.19
Вопросик маленький


3-1178281496
alsov
2007-05-04 16:24
2007.08.19
ADO+ftCursor+Oracle




   Наверх