Win64 extended floating fix

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@571 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2008-09-25 02:17:43 +00:00
parent 750cf8f8cf
commit b6b5e47eb7
3 changed files with 57 additions and 104 deletions

View File

@ -931,30 +931,8 @@ function TSOAPBaseFormatter.PutFloat(
const ATypeInfo : PTypeInfo;
const AData : Extended
):TDOMNode;
Var
s, frmt : string;
prcsn : Integer;
{$IFNDEF HAS_FORMAT_SETTINGS}
i : Integer;
{$ENDIF HAS_FORMAT_SETTINGS}
begin
Case GetTypeData(ATypeInfo)^.FloatType Of
ftSingle,
ftCurr,
ftComp : prcsn := 7;
ftDouble,
ftExtended : prcsn := 15;
End;
frmt := '#.' + StringOfChar('#',prcsn) + 'E-0';
{$IFDEF HAS_FORMAT_SETTINGS}
s := FormatFloat(frmt,AData,wst_FormatSettings);
{$ELSE}
s := FormatFloat(frmt,AData);
i := Pos(',',s);
if ( i > 0 ) then
s[i] := '.';
{$ENDIF HAS_FORMAT_SETTINGS}
Result := InternalPutData(ANameSpace,AName,ATypeInfo,s);
Result := InternalPutData(ANameSpace,AName,ATypeInfo,wst_FormatFloat(ATypeInfo,AData));
end;
function TSOAPBaseFormatter.GetNodeValue(const ANameSpace : string; var AName: String): DOMString;
@ -1088,7 +1066,7 @@ begin
{$IFDEF HAS_FORMAT_SETTINGS}
AData := StrToFloatDef(Trim(GetNodeValue(ANameSpace,AName)),0,wst_FormatSettings);
{$ELSE}
AData := StrToFloatDef(TranslateDotToDecimalSeperator(Trim(GetNodeValue(ANameSpace:=;,AName))),0);
AData := StrToFloatDef(TranslateDotToDecimalSeperator(Trim(GetNodeValue(ANameSpace,AName))),0);
{$ENDIF HAS_FORMAT_SETTINGS}
end;
@ -1735,8 +1713,6 @@ Var
enumData : TEnumIntType;
floatDt : Extended;
dataBuffer : DOMString;
frmt : string;
prcsn,i : Integer;
wideStrData : WideString;
{$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString;
@ -1825,37 +1801,13 @@ begin
begin
floatDt := 0;
case GetTypeData(ATypeInfo)^.FloatType of
ftSingle :
begin
floatDt := Single(AData);
prcsn := 7;
ftSingle : floatDt := Single(AData);
ftDouble : floatDt := Double(AData);
ftExtended : floatDt := Extended(AData);
ftCurr : floatDt := Currency(AData);
ftComp : floatDt := Comp(AData);
end;
ftDouble :
begin
floatDt := Double(AData);
prcsn := 15;
end;
ftExtended :
begin
floatDt := Extended(AData);
prcsn := 15;
end;
ftCurr :
begin
floatDt := Currency(AData);
prcsn := 7;
end;
ftComp :
begin
floatDt := Comp(AData);
prcsn := 7;
end;
end;
frmt := '#.' + StringOfChar('#',prcsn) + 'E-0';
dataBuffer := FormatFloat(frmt,floatDt);
i := Pos(',',dataBuffer);
if ( i > 0 ) then
dataBuffer[i] := '.';
dataBuffer := wst_FormatFloat(ATypeInfo,floatDt);
end;
end;
StackTop().ScopeObject.AppendChild(FDoc.CreateTextNode(dataBuffer));

View File

@ -922,23 +922,8 @@ function TXmlRpcBaseFormatter.PutFloat(
const ATypeInfo : PTypeInfo;
const AData : Extended
):TDOMNode;
Var
s, frmt : string;
prcsn,i : Integer;
begin
Case GetTypeData(ATypeInfo)^.FloatType Of
ftSingle,
ftCurr,
ftComp : prcsn := 7;
ftDouble,
ftExtended : prcsn := 15;
End;
frmt := '#.' + StringOfChar('#',prcsn) + 'E-0';
s := FormatFloat(frmt,AData);
i := Pos(',',s);
If ( i > 0 ) Then
s[i] := '.';
Result := InternalPutData(AName,xdtdouble,s);
Result := InternalPutData(AName,xdtdouble,wst_FormatFloat(ATypeInfo,AData));
end;
function TXmlRpcBaseFormatter.GetNodeValue(var AName: string): DOMString;
@ -1388,8 +1373,6 @@ Var
enumData : TEnumIntType;
floatDt : Extended;
dataBuffer : DOMString;
frmt : string;
prcsn,i : Integer;
wideStrData : WideString;
{$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString;
@ -1478,37 +1461,13 @@ begin
begin
floatDt := 0;
case GetTypeData(ATypeInfo)^.FloatType of
ftSingle :
begin
floatDt := Single(AData);
prcsn := 7;
ftSingle : floatDt := Single(AData);
ftDouble : floatDt := Double(AData);
ftExtended : floatDt := Extended(AData);
ftCurr : floatDt := Currency(AData);
ftComp : floatDt := Comp(AData);
end;
ftDouble :
begin
floatDt := Double(AData);
prcsn := 15;
end;
ftExtended :
begin
floatDt := Extended(AData);
prcsn := 15;
end;
ftCurr :
begin
floatDt := Currency(AData);
prcsn := 7;
end;
ftComp :
begin
floatDt := Comp(AData);
prcsn := 7;
end;
end;
frmt := '#.' + StringOfChar('#',prcsn) + 'E-0';
dataBuffer := FormatFloat(frmt,floatDt);
i := Pos(',',dataBuffer);
if ( i > 0 ) then
dataBuffer[i] := '.';
dataBuffer := wst_FormatFloat(ATypeInfo,floatDt);
end;
end;
StackTop().ScopeObject.AppendChild(FDoc.CreateTextNode(dataBuffer));

View File

@ -46,6 +46,11 @@ Type
function GetToken(var ABuffer : string; const ADelimiter : string): string;
function ExtractOptionName(const ACompleteName : string):string;
function TranslateDotToDecimalSeperator(const Value: string) : string;
function wst_FormatFloat(
const ATypeInfo : PTypeInfo;
const AData : Extended
) : string;
function LoadBufferFromFile(const AFileName : string) : TBinaryString;
function LoadBufferFromStream(AStream : TStream) : TBinaryString;
@ -101,6 +106,43 @@ begin
end;
end;
function wst_FormatFloat(
const ATypeInfo : PTypeInfo;
const AData : Extended
) : string;
var
s, frmt : string;
prcsn : Integer;
{$IFNDEF HAS_FORMAT_SETTINGS}
i : PtrInt;
{$ENDIF HAS_FORMAT_SETTINGS}
begin
case GetTypeData(ATypeInfo)^.FloatType Of
ftSingle,
ftCurr,
ftComp : prcsn := 7;
ftDouble,
ftExtended :
begin
{$IF Defined(FPC_HAS_TYPE_DOUBLE) OR Defined(FPC_HAS_TYPE_EXTENDED)}
prcsn := 14;
{$ELSE}
prcsn := 7;
{$IFEND}
end;
end;
frmt := '#.' + StringOfChar('#',prcsn) + 'E-0';
{$IFDEF HAS_FORMAT_SETTINGS}
s := FormatFloat(frmt,AData,wst_FormatSettings);
{$ELSE}
s := FormatFloat(frmt,AData);
i := Pos(',',s);
if ( i > 0 ) then
s[i] := '.';
{$ENDIF HAS_FORMAT_SETTINGS}
Result := s
end;
function LoadBufferFromStream(AStream : TStream) : TBinaryString;
var
len : Int64;