придумал вот такой изврат
Код:
function ExpotentialToStr(s: string): string;
var
PosE, PosDot: integer; {позиции буквы E и точки}
CountZeroStr: string; {кол-во нулей для добавления (строка)}
CountZero: integer; {кол-во нулей для добавления (число)}
MinusCountZero: integer; {число нулей, которое надо убрать}
ZeroStr: string; {строка с нулями}
ErrorCode: integer; {код ошибки (для Val)}
begin
{удаляем пробел}
if s[1] = ' ' then
Delete(s, 1, 1);
PosE := Pos('E', s); {позиция буквы E}
if PosE > 0 then begin {если она есть}
PosDot := Pos('.', s); {позиция точки}
CountZeroStr := Copy(s, PosE + 2, 4); {степень у E - это и есть кол-во нулей}
Val(CountZeroStr, CountZero, ErrorCode);
if s[PosE + 1] = '+' then begin {если степень положительная}
MinusCountZero := PosE - PosDot - 1; {кол-во знаков от точки до E - их кол-во надо убрать из кол-ва нулей, которое мы получили выше}
CountZero := CountZero - MinusCountZero; {конечное число нулей для добавления}
Delete(s, PosE, 6); {удаляем E}
Delete(s, PosDot, 1); {удаляем точку}
FillChar(ZeroStr, CountZero + 1, '0'); {строка с нулями}
ZeroStr[0] := Chr(CountZero);
s := s + ZeroStr; {объединяем число с нулями}
end
else begin {если степень отрицательная}
MinusCountZero := PosDot - 1; {кол-во знаков до точки}
CountZero := CountZero - MinusCountZero; {конечное число нулей для добавления}
Delete(s, PosE, 6); {удаляем E}
while s[Length(s)] = '0' do
Delete(s, Length(s), 1); {удаляем все нули справа от числа}
Delete(s, PosDot, 1); {удаляем точку}
FillChar(ZeroStr, CountZero + 1, '0'); {строка с нулями}
ZeroStr[0] := Chr(CountZero);
s := '0.' + ZeroStr + s; {объединяем число и нули}
end;
end;
ExponentialToStr := s;
end;
ничего проще не придумывается

)
вроде работает правильно.. НО!! только для чисел у которых степень больше 14 - если меньше она сглюканет.. но я это еще не проверил - если хочешь попробуй - но думаю не сработает
если для малых чисел нужно - могу доработать