楼主给出的转换似乎有问题啊—— -1.23456789E-07 应该被转成 -.123456789E-06 才对。
function MyFloatStrFormat(const AStr: String):String;
var
Str:String;
n,e,x,m:Integer;
begin
Result:=AStr;
if Length(AStr)<3 then exit;
if AStr[1]<>'-' then exit; //非负数
e:=Pos('E',AStr);
if e=0 then exit; //非科学计数法的数字
if not TryStrToInt(Copy(AStr,e+1,MaxInt),x) then exit; //E之后的不是合法整数
Str:=Copy(AStr,2,e-2); //截取 - 与 E 之间的部分
while (Str<>'') and (Str[1]='0') do //消除数字的前导0
Delete(Str,1,1);
n:=Pos('.',Str);
if n=0 then //没有小数点,需在头部追加小数点
begin
n:=Length(Str);
Inc(x,n);
Str:='.'+Str;
end
else begin //有小数点
Inc(x,n-1);
Str:='.'+StringReplace(Str,'.','',[]);
end;
m:=Length(AStr)-e-1; //计算得到幂的位数
if x>=0 then
Result:=Format('-%sE+%.0'+IntToStr(m)+'d',[Str,x])
else
Result:=Format('-%sE-%.0'+IntToStr(m)+'d',[Str,-x]);
end;
测试过程如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=MyFloatStrFormat('-1.23456789E-07')
+' '+MyFloatStrFormat('-0.23456789E-07')
+' '+MyFloatStrFormat('-123456789E-07')
+' '+MyFloatStrFormat('-88.12E-127');
end;
测试结果:
-.123456789E-06 -.23456789E-07 -.123456789E+02 -.8812E-125