使VarToDoubleAsString使用Delphi设置(不是OS设置)

使VarToDoubleAsString使用Delphi设置(不是OS设置),第1张

概述当一个包含字符串值的Variant分配给一个浮点变量时,Delphi调用VarToDoubleAsString来进行转换,转换又使用十进制和千位分隔符的OS设置(通过VarR8FromStr).如果必须更改SysUtils.DecimalSeparator和SysUtils.ThousandSeparator,则会出现问题.例如,运行以下程序: program VarStrToFloat;{$ 当一个包含字符串值的Variant分配给一个浮点变量时,Delphi调用VarTodoubleAsstring来进行转换,转换又使用十进制和千位分隔符的OS设置(通过VarR8FromStr).如果必须更改SysUtils.DecimalSeparator和SysUtils.ThousandSeparator,则会出现问题.例如,运行以下程序:

program VarStrTofloat;{$APPTYPE CONSolE}uses  SysUtils,Math;function FormatfloatUsingDelphiSettings(Value: Extended): string;begin  Result := Formatfloat('#,##0.00',Value);end;procedure Test(const AMsg: string);var  r1,r2: Extended;  s1,s2: string;  v: Variant;begin  r1 := 5432.1;  s1 := FormatfloatUsingDelphiSettings(r1);  v := s1; // <== conversion uses OS settings  r2 := v;  s2 := FormatfloatUsingDelphiSettings(r2);  Write(AMsg: 8,s1: 10,s2: 10,'  ');  if SameValue(r1,r2) then    Writeln('OK')  else    Writeln('FAIL');end;procedure SwapEm;var  tmp: Char;begin  tmp := DecimalSeparator;  DecimalSeparator := ThousandSeparator;  ThousandSeparator := tmp;end;begin  Test('Default');  SwapEm;  Test('Changed');  Readln;end.

第一个测试工作正常,第二个测试失败.

有没有办法让Variant转换使用SysUtils.DecimalSeparator和SysUtils.ThousandSeparator?

解决方法 您可以根据自己的喜好替换varutils.pas中的VarR8FromStr函数,VarTodoubleAsstring将使用它:

function MyConversion(const strIn: WIDeString; LCID: Integer; DWFlags: Longint;    out dblOut: Double): HRESulT; stdcall;const  CResult: array [False..True] of HRESulT = (VAR_INVALIDARG,VAR_OK);var  s: string;begin  s := StringReplace(StrIn,ThousandSeparator,'',[rfReplaceAll]);  Result := CResult[TryStrTofloat(s,dblOut)];end;[...]begin  varutils.VarR8FromStr := MyConversion;  [...]
总结

以上是内存溢出为你收集整理的使VarToDoubleAsString使用Delphi设置(不是OS设置)全部内容,希望文章能够帮你解决使VarToDoubleAsString使用Delphi设置(不是OS设置)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1268890.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存